URL: https://www.giga.de/downloads/irfanview/
Submission: On February 20 via manual from US

Summary

This website contacted 71 IPs in 11 countries across 63 domains to perform 242 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
19 178.19.72.10 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.103.64 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
3 188.40.16.106 24940 (HETZNER-AS)
9 178.19.70.100 29551 (HGCOMP-ASN)
3 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f11... 32934 (FACEBOOK)
10 2a00:1450:400... 15169 (GOOGLE)
3 143.204.201.153 16509 (AMAZON-02)
1 2 23.37.42.216 16625 (AKAMAI-AS)
2 8 92.122.247.161 16625 (AKAMAI-AS)
2 107.178.241.34 15169 (GOOGLE)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.103.65 43407 (INFONLINE-AS)
14 109.71.25.30 29551 (HGCOMP-ASN)
4 178.19.72.20 29551 (HGCOMP-ASN)
6 151.101.114.2 54113 (FASTLY)
1 14 216.58.207.66 15169 (GOOGLE)
1 143.204.202.10 16509 (AMAZON-02)
1 23.36.232.106 16625 (AKAMAI-AS)
1 1 2600:9000:205... 16509 (AMAZON-02)
1 2600:9000:214... 16509 (AMAZON-02)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 18.194.129.32 16509 (AMAZON-02)
9 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
2 2606:4700:20:... 13335 (CLOUDFLAR...)
1 178.19.65.130 29551 (HGCOMP-ASN)
3 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 209.197.3.15 20446 (HIGHWINDS3)
3 7 104.85.250.71 16625 (AKAMAI-AS)
6 52.28.163.206 16509 (AMAZON-02)
7 136.243.5.14 24940 (HETZNER-AS)
1 3 3.124.22.230 16509 (AMAZON-02)
1 2 52.94.216.48 16509 (AMAZON-02)
5 2a00:1450:400... 15169 (GOOGLE)
1 12 151.101.14.2 54113 (FASTLY)
2 151.101.13.194 54113 (FASTLY)
1 1 35.201.85.158 15169 (GOOGLE)
2 2 18.194.47.206 16509 (AMAZON-02)
1 2 151.101.14.49 54113 (FASTLY)
1 69.173.144.139 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
2 2 185.29.135.181 30419 (MEDIAMATH...)
1 1 74.214.194.140 59940 (PULSEPOIN...)
2 2 185.184.8.30 204995 (RTB-HOUSE...)
2 185.33.223.203 29990 (ASN-APPNEX)
1 1 172.217.22.2 15169 (GOOGLE)
2 2 54.229.35.82 16509 (AMAZON-02)
1 1 35.160.248.135 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 141.226.224.32 200478 (TABOOLA-AS)
3 3 35.157.107.235 16509 (AMAZON-02)
2 2 188.42.29.196 7979 (SERVERS)
7 185.22.221.117 60955 (WAVECON)
2 18.194.21.214 16509 (AMAZON-02)
4 52.219.75.27 16509 (AMAZON-02)
6 143.204.202.68 16509 (AMAZON-02)
1 62.168.44.126 5588 (GTSCE GTS...)
5 5.9.139.135 24940 (HETZNER-AS)
4 2.18.232.7 16625 (AKAMAI-AS)
2 2a02:26f0:f3:... 20940 (AKAMAI-ASN1)
6 72.247.225.182 16625 (AKAMAI-AS)
1 84.53.164.178 16625 (AKAMAI-AS)
2 144.76.115.236 24940 (HETZNER-AS)
10 82.149.242.6 29551 (HGCOMP-ASN)
1 2a00:1450:400... 15169 (GOOGLE)
1 3 148.251.151.158 24940 (HETZNER-AS)
1 37.157.2.235 198622 (ADFORM)
1 89.163.159.104 24961 (MYLOC-AS)
1 194.213.222.30 5588 (GTSCE GTS...)
4 52.30.98.41 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 143.204.202.74 16509 (AMAZON-02)
1 89.163.159.125 24961 (MYLOC-AS)
1 2600:9000:214... 16509 (AMAZON-02)
1 18.200.89.230 16509 (AMAZON-02)
1 1 89.163.159.109 24961 (MYLOC-AS)
1 176.34.153.100 16509 (AMAZON-02)
242 71
Apex Domain
Subdomains
Transfer
47 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.2.damoh.giga.de
ssl.1.damoh.giga.de
886 KB
20 taboola.com
cdn.taboola.com
trc.taboola.com
match.taboola.com
cds.taboola.com
184 KB
18 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
223 KB
11 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
192 KB
10 spieletips.de
lx56.spieletips.de
18 MB
10 google-analytics.com
www.google-analytics.com
19 KB
9 m6r.eu
cdn.m6r.eu
tracking.m6r.eu
4 KB
8 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
752 B
8 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
121 KB
7 oadts.com
media.oadts.com
122 KB
7 meetrics.net
lb75.s400.meetrics.net
2 KB
7 scorecardresearch.com
sb.scorecardresearch.com
4 KB
6 svonm.com
hgc-cf-cache-1.svonm.com
124 KB
5 googletagservices.com
www.googletagservices.com
122 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
29 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
14 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 amazonaws.com
s3.eu-central-1.amazonaws.com
3 KB
4 adscale.de
ih.adscale.de
js.adscale.de
6 KB
4 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
212 KB
4 giga-abs.de
go.giga-abs.de
2 KB
4 nativendo.de
d.nativendo.de
c.nativendo.de
21 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
96 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 schneevonmorgen.com
adserver.schneevonmorgen.com
786 B
3 bidswitch.net
x.bidswitch.net
1 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
849 B
2 consensu.org
cmp.teads.mgr.consensu.org
2 ibillboard.com
video-adserver.ibillboard.com
bbcdn-bbnaut.ibillboard.com
2 KB
2 giga-video.de
files.giga-video.de
39 KB
2 betweendigital.com
ads.betweendigital.com
1013 B
2 adsrvr.org
match.adsrvr.org
914 B
2 adnxs.com
ib.adnxs.com
1 KB
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
22 KB
2 google.com
adservice.google.com
342 B
2 google.de
adservice.google.de
349 B
2 userreport.com
nugmw.userreport.com
sak.userreport.com
22 KB
2 facebook.com
www.facebook.com
497 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
580 B
1 adform.net
track.adform.net
495 B
1 2mdn.net
s0.2mdn.net
10 KB
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
343 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
430 B
1 contextweb.com
bh.contextweb.com
442 B
1 powerlinks.com
px.powerlinks.com
402 B
1 rubiconproject.com
pixel.rubiconproject.com
239 B
1 zorosrv.com
match.zorosrv.com
293 B
1 exposebox.com
server.exposebox.com
386 B
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
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
561 B
1 mxcdn.net
s400.mxcdn.net
49 KB
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 gstatic.com
www.gstatic.com
144 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
242 63
Domain Requested by
19 www.giga.de www.giga.de
14 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
www.googletagservices.com
14 videos.giga.de www.giga.de
videos.giga.de
text
12 trc.taboola.com 1 redirects cdn.taboola.com
www.giga.de
10 lx56.spieletips.de videos.giga.de
10 www.google-analytics.com www.giga.de
8 tracking.m6r.eu 2 redirects www.giga.de
tracking.m6r.eu
7 media.oadts.com www.giga.de
media.oadts.com
7 lb75.s400.meetrics.net www.giga.de
7 sb.scorecardresearch.com 3 redirects cdn.taboola.com
www.giga.de
7 static.giga.de www.giga.de
6 t.teads.tv www.giga.de
6 hgc-cf-cache-1.svonm.com videos.giga.de
text
6 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
6 cdn.taboola.com www.giga.de
cdn.taboola.com
5 ssl.2.damoh.giga.de text
5 tpc.googlesyndication.com securepubads.g.doubleclick.net
5 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
4 a.teads.tv www.giga.de
a.teads.tv
4 s3.eu-central-1.amazonaws.com videos.giga.de
text
4 go.giga-abs.de www.giga.de
3 adserver.schneevonmorgen.com 1 redirects text
3 x.bidswitch.net 3 redirects
3 ih.adscale.de 1 redirects www.giga.de
js.adscale.de
3 imasdk.googleapis.com videos.giga.de
imasdk.googleapis.com
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 de.ioam.de 2 redirects www.giga.de
3 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.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 ssl.1.damoh.giga.de text
2 cmp.teads.mgr.consensu.org a.teads.tv
2 files.giga-video.de videos.giga.de
2 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 ads.betweendigital.com 2 redirects
2 match.adsrvr.org 2 redirects
2 ib.adnxs.com www.giga.de
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 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 c.nativendo.de d.nativendo.de
c.nativendo.de
2 adservice.google.com pagead2.googlesyndication.com
imasdk.googleapis.com
2 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
2 d.nativendo.de www.giga.de
c.nativendo.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 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 sak.userreport.com nugmw.userreport.com
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 js.adscale.de js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 s0.2mdn.net imasdk.googleapis.com
1 sync.teads.tv a.teads.tv
1 video-adserver.ibillboard.com media.oadts.com
1 cdn.stroeerdigitalmedia.de www.giga.de
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 cm.g.doubleclick.net 1 redirects
1 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 maxcdn.bootstrapcdn.com www.giga.de
1 ajax.googleapis.com www.giga.de
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 js.stroeermediabrands.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
242 91
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
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
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 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-01-29 -
2020-04-22
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
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
sni.cloudflaressl.com
CloudFlare Inc ECC CA-2
2019-11-17 -
2020-10-09
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-01-29 -
2020-04-22
3 months 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
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-11-25 -
2020-12-25
a year crt.sh
meetrics.net
Let's Encrypt Authority X3
2019-12-03 -
2020-03-02
3 months crt.sh
*.adscale.de
Amazon
2019-07-03 -
2020-08-03
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year 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
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.bttrack.com
Sectigo RSA Domain Validation Secure Server CA
2019-03-19 -
2021-04-13
2 years crt.sh
*.taboola.com
DigiCert ECC Secure Server CA
2019-09-03 -
2020-09-10
a year crt.sh
*.oadts.com
RapidSSL TLS RSA CA G1
2018-05-02 -
2020-06-30
2 years crt.sh
yieldlove-ad-serving.net
Amazon
2019-11-19 -
2020-12-19
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
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2020-01-21 -
2020-04-20
3 months crt.sh
teads.tv
Let's Encrypt Authority X3
2020-01-08 -
2020-04-07
3 months crt.sh
teads.mgr.consensu.org
Let's Encrypt Authority X3
2020-02-03 -
2020-05-03
3 months crt.sh
lx56.spieletips.de
Let's Encrypt Authority X3
2020-02-12 -
2020-05-12
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2020-01-29 -
2020-04-22
3 months crt.sh
adserver.bannertgt.com
Let's Encrypt Authority X3
2019-12-12 -
2020-03-11
3 months crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2020-01-08 -
2021-03-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
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 24 frames:

Primary Page: https://www.giga.de/downloads/irfanview/
Frame ID: 411BDEB001F1FF7AB1C5ECED71B77340
Requests: 137 HTTP requests in this frame

Frame: https://videos.giga.de/embed/172493?autoplay=1
Frame ID: E031D862E5BCE369D71FEB8F01A6741B
Requests: 40 HTTP requests in this frame

Frame: https://videos.giga.de/embed/172495?autoplay=0
Frame ID: 3227227EA4C4A15A3AFD034A75E41CE7
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: 7CD898C4F4A49CC959CA2C94B8108FFD
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20200219/r20190131/zrt_lookup.html
Frame ID: 836E5E9644A737B9B1CCEE2517674994
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=250&slotname=9921598555&adk=2154913067&adf=2485742297&w=300&lmt=1582224383&psa=0&guci=1.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&flash=0&wgl=1&adsid=NT&dt=1582224382932&bpp=16&bdt=372&fdt=87&idt=87&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5725820942077&frm=20&pv=2&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=52843133006798&dssz=67&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=561&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065304%2C44714237&oid=3&pvsid=1056494168406379&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CleE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=7uMG0xRID4&p=https%3A//www.giga.de&dtd=102
Frame ID: 76F008576D4AAA6F52974A2960FE2273
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=1582224383&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%2Fdownloads%2Firfanview%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582224382948&bpp=3&bdt=389&fdt=130&idt=130&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=300x250&nras=1&correlator=5725820942077&frm=20&pv=1&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=211372532027198&dssz=69&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=21065304%2C44714237&oid=3&pvsid=1056494168406379&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=136
Frame ID: 84EAD1ADCA170DEE050C970746CB2ED0
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: F96474102C70A9EE92115AD83E2EAB9F
Requests: 1 HTTP requests in this frame

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

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstYIe5PMP5jXMNZ-E6kBuRWKP_urPz0P-VwFTBbj_P68GubIa-rA8t-fVA0aF-vkz29SpASlAM4swGeSo4Are0FM1THTd25Mde0BFTtdDwYDQmkle2KHTc0SRkxVijqc0zDlhwoU6d3JlTNTvz9xIXk9ZJdNI0xdSlHplz7AEwyYel63jjFJXeFqZ35Zquj1HHw14_HNl_Cz8ZhDwYqvSPkXEDzjHmZ8pFkjdVUJOOcBh0Y_9SjwImx_I9gVpUU8Wk11daI0oRmoAbtdp8FdM-eRzEQ2HDp&sig=Cg0ArKJSzKOhtKxPcKU9EAE&urlfix=1&adurl=
Frame ID: BBED4B2CD5013A836EF851D7923B5ACC
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstPGai1J1otUh669d1gj6Syvo54sgJWb3SotQFL3A2Je7Ll4yrLZeDjo4nV-8XSUKTVqiudOqz10fYJlhOedQWirE90vydDuQHQNZCq63UfDlk00PCx1EIyxlu8Jsh7fnwsjxO0tYP-qYFox06Jr4ZZFmzCXI0JsGnXAwERX50OKEmtrojruN_lDmhxRuSvPM6eu-KxTKhuSeGY_ClTc-OXaiSyrlIYwiF2fXYsxt7zgXm7p0nOjlwF2yGVpaqRYn7AgqpFNnz4HlmrtBmxe7DczCyK&sig=Cg0ArKJSzAa37o-pJpEmEAE&urlfix=1&adurl=
Frame ID: 7A4CA1FE1E03E2F19ABD8622BFDDF583
Requests: 11 HTTP requests in this frame

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

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

Frame: https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
Frame ID: 3A927709CCD9397B4B66B81DFB180B3E
Requests: 1 HTTP requests in this frame

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

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

Frame: https://sync.teads.tv/iframe?pid=76332&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1582224387023
Frame ID: 67C1DB452E65DBD713D3B2BD51F40F4A
Requests: 1 HTTP requests in this frame

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

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

Frame: https://imasdk.googleapis.com/js/core/bridge3.368.0_en.html
Frame ID: 8E56F48998275659DB3BD3012BC4253C
Requests: 1 HTTP requests in this frame

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

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

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

242
Requests

98 %
HTTPS

19 %
IPv6

63
Domains

91
Subdomains

71
IPs

11
Countries

21587 kB
Transfer

27351 kB
Size

1
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 12
  • https://ssl-econa.met.vgwort.de/na/14f006f237504649960c529ba2c4929a 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 19
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=0009f71bbf3ffcb945e4ed3fe&ep=1609585573&vr=416&id=sxnjyl&i3=0009f71bbf3ffcb945e4ed3fe%3A1613587582759%3A1582224382759%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1582224382759&n1=4&dntt=0&lt=1582224382761&ev=&cs=6ucdg4&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=0009f71bbf3ffcb945e4ed3fe&ep=1609585573&vr=416&id=sxnjyl&i3=0009f71bbf3ffcb945e4ed3fe%3A1613587582759%3A1582224382759%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1582224382759&n1=4&dntt=0&lt=1582224382761&ev=&cs=6ucdg4&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 28
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 33
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 34
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Request Chain 80
  • 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://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9=
Request Chain 97
  • https://server.exposebox.com/rcm HTTP 302
  • https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_isttm14
Request Chain 98
  • 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=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398 HTTP 302
  • https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&tbid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&query=taboola_hm%3D3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&isDirect=0 HTTP 302
  • https://match.zorosrv.com/match?tabid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&extuid=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&excid=218&query=taboola_hm%3D3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
Request Chain 100
  • 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=N014F5_mY-JBihXLyWhUljabGIEPkgrP_TmaC93_kjc%3D
Request Chain 101
  • 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=15265e4e-d3ff-4d00-82ae-a3b192fed12a HTTP 302
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=15265e4e-d3ff-4d00-82ae-a3b192fed12a
Request Chain 102
  • 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=TasGYLF52Y6u&ev=1&pid=562107
Request Chain 103
  • 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=A2RPvMNPzKkOr3BKERih&pi=taboola&tc=1
Request Chain 105
  • 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=CAESEGnKKKJq17pYqyipNDARnAk&google_cver=1
Request Chain 107
  • 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=cb6ec19e-32c5-4819-a61d-d2b1b34ca6ad
Request Chain 108
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
Request Chain 111
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://ads.betweendigital.com/match?bidder_id=43092&callback_url=https%3A%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D429%26user_id%3D%24%7BUSER_ID%7D%26ssp%3Dtaboola%26expires%3D30 HTTP 302
  • https://ads.betweendigital.com/match?bidder_id=43092&callback_url=https%3A%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D429%26user_id%3D%24%7BUSER_ID%7D%26ssp%3Dtaboola%26expires%3D30&crf=1 HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=429&user_id=238f4027-9e91-3820-9c54-f0af531656b1&ssp=taboola&expires=30 HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cf90a98-1a4f-412a-bcd7-27661d6d41b2
Request Chain 114
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvn8xcJcmUuLnnbFq6nGTaoYQGWO9xYossu092-CX713GM6y698_VD5CUY2bSwh48Uu5BTr3--BoiMjY18oArZxxQyWVIcJGccTLK13zNJK7hRTdd2PrEOvHXIFAFQEyl7FTg_CEgddzVc8_skDDqOBlvinLXSu8zqQ3FEybAuLfA_uBah4HyRgemGt2FUu8mTNzRbW0NHCrOwagxFf5JSK1U2Xxfej4EFnfaTuA2J2-So9rs5unn2mtBntApxtbGLL2pb9JdGjSWlcFyAxmfhYANzw&sig=Cg0ArKJSzDi4-XB6WxiWEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 174
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=87929085&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F HTTP 302
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=87929085&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Request Chain 177
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=41238701&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F HTTP 302
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=41238701&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Request Chain 209
  • https://adserver.schneevonmorgen.com/adserve/v1/cc HTTP 302
  • https://adserver.schneevonmorgen.com/adserve/v1/cc?sbs=true
Request Chain 236
  • https://ih.adscale.de/map?ssl=1&format=video HTTP 302
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=1431cd1356274ad2a9f4bf7759a8bcf5
Request Chain 242
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BD7kWi_ABiJ0BSUkWsfABifABSfABSfABifABifABfrr&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=4218649483600541032

242 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/downloads/irfanview/
197 KB
64 KB
Document
General
Full URL
https://www.giga.de/downloads/irfanview/
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
21d2518eee6b649ab93701f25839d3d1ef48f34f95efbff0b3496ad64ce04b2e

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:22 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/downloads/irfanview/
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:22 GMT
last-modified
Thu, 20 Feb 2020 12:28:22 GMT
server
nginx
accept-language
bytes
etag
"5e4e7b66-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
Fri, 19 Feb 2021 18:46:22 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/downloads/irfanview/
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:22 GMT
last-modified
Thu, 20 Feb 2020 12:28:22 GMT
server
nginx
accept-language
bytes
etag
"5e4e7b66-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
Fri, 19 Feb 2021 18:46:22 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/downloads/irfanview/
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:22 GMT
last-modified
Thu, 20 Feb 2020 12:28:22 GMT
server
nginx
accept-language
bytes
etag
"5e4e7b66-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
Fri, 19 Feb 2021 18:46:22 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/downloads/irfanview/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.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/downloads/irfanview/
User-Agent
Mozilla/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
5761
x-cache
HIT
status
200
x-cache-hits
1196
content-length
6490
via
1.1 varnish
x-served-by
cache-fra19160-FRA
last-modified
Thu, 20 Feb 2020 17:10:20 GMT
server
Apache
x-timer
S1582224383.720070,VS0,VE0
date
Thu, 20 Feb 2020 18:46:22 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
Thu, 27 Feb 2020 17:10:20 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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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:39 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:39 GMT
main-desktop-f9225ecdac.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-f9225ecdac.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
a817c4029c6444c1fc28d3cb4696e3309ae4eb10000f5e2acd44d6cd6317b106

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 12:29:39 GMT
content-encoding
gzip
x-original-content-length
561234
server
nginx
status
200
etag
W/"5e4e7b66-89052"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
63041
expires
Fri, 19 Feb 2021 12:29:39 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/downloads/irfanview/
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 0009
Resource Hash
7397c0324a1f3a81f89c564497d4e203b9c124695dff9504c159f6c976b8bede

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Feb 2020 18:46:22 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.12 0009
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
Thu, 20 Feb 2020 20:46:22 GMT
metaTag.min.4f65a0e9fe0d6367b27b800ce874e982.js
js.stroeermediabrands.de/
280 KB
63 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.4f65a0e9fe0d6367b27b800ce874e982.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
9b4e4a1881cb5a98b060f962b6cec10b3bee8037e84f03d388814a00ddbf5e34

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 GMT
content-encoding
gzip
last-modified
Wed, 19 Feb 2020 14:03: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
Fri, 19 Feb 2021 18:46:22 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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 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
Fri, 21 Feb 2020 18:46:22 GMT
marvin-profilbild-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/05/
1 KB
2 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2013/05/marvin-profilbild-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
147661cca6ee800a4b88686db1e7b346feab5abf1e2e0788d7d7dfe9b8eec98c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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:14 GMT
x-content-type-options
nosniff
age
360369
filer-source
7c6e7ec609f04e68fbd09b6822c537f28cc98112ad6462268f3669c85c3b32a9
x-cache
HIT
status
200
accept-language
bytes
content-length
1198
x-xss-protection
1; mode=block
last-modified
Sun, 16 Feb 2020 14:40:14 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
Tue, 17 Mar 2020 14:40:14 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/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
b6905f3ba1c618c861171cddd4461c554d0811680af7b6755ec96ac8a7a7c113
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 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
38665
x-xss-protection
0
server
cafe
etag
827827238514912278
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Thu, 20 Feb 2020 18:46:22 GMT
1.gif
www.gstatic.com/psa/static/
53 B
144 B
Image
General
Full URL
https://www.gstatic.com/psa/static/1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::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/downloads/irfanview/
User-Agent
Mozilla/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 04:21:06 GMT
x-content-type-options
nosniff
last-modified
Tue, 22 Oct 2019 18:15:00 GMT
server
sffe
age
1434316
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 04:21:06 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/14f006f237504649960c529ba2c4929a
  • 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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/5.0 (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
Thu, 20 Feb 2020 18:46:22 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
Thu, 20 Feb 2020 18:46:22 GMT
Last-Modified
Thu, 20 Feb 2020 18:46:22 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/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183: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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:22 GMT, Thu, 20 Feb 2020 18:46:22 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
Thu, 20 Feb 2020 18:46:22 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:824::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/downloads/irfanview/
User-Agent
Mozilla/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
3472
date
Thu, 20 Feb 2020 17:48:30 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
Thu, 20 Feb 2020 19:48:30 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.201.153 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-201-153.fra53.r.cloudfront.net
Software
Server /
Resource Hash
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 02:32:07 GMT
content-encoding
gzip
server
Server
age
58455
etag
1dcfbf3986ee8b9c3abbc67eb808ab43
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
wxbvr_lKbG0pJwFEepftn6SlTSx5RQXynZUhIRD4tj4rgFQIlLAh0g==
via
1.1 f960fa0538fdb326fc338e984fa7ece9.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/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
92.122.247.161 , France, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-247-161.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 20 Feb 2020 18:46:23 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Feb 2020 10:16:35 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
Thu, 20 Feb 2020 18:46:23 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
Thu, 20 Feb 2020 18:46:23 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/downloads/irfanview/
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
80c4205204326ba3864af6bda1a5fc4650cfc338a733eb1bdf8ca85ae7dbba1c

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:22 GMT
content-encoding
gzip
last-modified
Thu, 20 Feb 2020 18:46:22 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
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.4873164822808562
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:22 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=0009f71bbf3ffcb945e4ed3fe&ep=1609585573...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=0009f71bbf3ffcb945e4ed3fe&ep=1609585573...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

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

Redirect headers

Date
Thu, 20 Feb 2020 18:46:22 GMT
X-Powered-By
BLACKBIRD-RCV v1.06.2 001f
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
Thu, 20 Feb 2020 18:46:22 GMT
Server
nginx
Location
/blank.gif
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
Wed, 20 Feb 2019 18:46:22 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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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:30:49 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:30:49 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/downloads/irfanview/
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-f9225ecdac.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
Thu, 20 Feb 2020 18:46:22 GMT
last-modified
Thu, 20 Feb 2020 12:28:22 GMT
server
nginx
accept-language
bytes
etag
"5e4e7b66-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
Fri, 19 Feb 2021 18:46:22 GMT
172493
videos.giga.de/embed/ Frame E031
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/172493?autoplay=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
d1a22e27e6c4e5ede802181af1c093af4d5092c146dccadfbcf46ced481e2e9b

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/172493?autoplay=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
same-site
sec-fetch-mode
navigate
referer
https://www.giga.de/downloads/irfanview/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
pc=1; ioam2018=0009f71bbf3ffcb945e4ed3fe:1613587582759:1582224382759:.giga.de:2:giga:software_content:noevent:1582224382759:wxxkq2
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/downloads/irfanview/

Response headers

status
200
server
nginx/1.14.1
date
Thu, 20 Feb 2020 18:46:22 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/172493>; rel="canonical"
content-encoding
gzip
172495
videos.giga.de/embed/ Frame 3227
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/172495?autoplay=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
e6a3685466a77fa9b1fc6c44ae027d0be6e1f9a0e4f7be0850faffb36e7271e4

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/172495?autoplay=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-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/downloads/irfanview/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
pc=1; ioam2018=0009f71bbf3ffcb945e4ed3fe:1613587582759:1582224382759:.giga.de:2:giga:software_content:noevent:1582224382759:wxxkq2
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/downloads/irfanview/

Response headers

status
200
server
nginx/1.14.1
date
Thu, 20 Feb 2020 18:46:22 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/172495>; rel="canonical"
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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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:41:55 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:41:55 GMT
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
647 B
865 B
Image
General
Full URL
https://www.giga.de/wp-content/themes/project/assets/img/teaser/bg-teaser.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b

Request headers

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

Response headers

date
Wed, 27 Mar 2019 23:22:31 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-287"
status
200
access-control-allow-methods
GET
content-type
image/png
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
647
expires
Thu, 26 Mar 2020 23:22:31 GMT
collect
www.google-analytics.com/r/
35 B
111 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=139742495&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=471725603&gjid=1194451110&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&_r=1&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&z=1871123659
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:22 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.07119019533629456
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
d77110be9f7aee2ee178c7497f8c108c2ddc4648662cecc5caa19db85f3e038c
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 GMT
X-Content-Type-Options
nosniff
Last-Modified
Thu, 20 Feb 2020 18:46:22 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Fri, 21 Feb 2020 18:46:08 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame 7CD8
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
0
0
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
92.122.247.161 , France, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-247-161.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/downloads/irfanview/
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/downloads/irfanview/

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
Thu, 20 Feb 2020 18:46:23 GMT
Content-Length
1575
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=86421fabd0db152b1e74d1a98349514f; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Wed, 20 May 2020 18:46:23 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
Thu, 20 Feb 2020 18:46:22 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Thu, 20 Feb 2020 19:46:22 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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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
72
x-cache
HIT
status
200
date
Thu, 20 Feb 2020 18:46:22 GMT
x-amz-replication-status
COMPLETED
content-length
20920
x-amz-id-2
LI6cx4IeG+Bt2JpditpOqjn+MUsCAqQqrDtch6WaYAPzr0rNDnfLNAsDkswCIHc/iNSP/CJlE5g=
x-served-by
cache-hhn4020-HHN
last-modified
Wed, 29 Jan 2020 13:46:08 GMT
server
AmazonS3
x-timer
S1582224383.924721,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
96
x-cache-hits
18
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.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
sffe /
Resource Hash
c44986bcd6d5bd597a9a06f1129e3cc51cce4be78506dcd9a88c140e54c1376e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"433 / 683 of 1000 / last-modified: 1582218796"
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
14496
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:22 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
289 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.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.202.10 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-10.fra53.r.cloudfront.net
Software
/ Express
Resource Hash
8003d73a961c2273e29b6765ce52c4c24ba66c48fb7e7d6d5dfb356eb618d820

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 16:22:04 GMT
content-encoding
gzip
age
8659
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
FRA53-C1
access-control-allow-origin
*
x-amz-cf-id
tMeTvY8A74dEiqhQ8CKQxDtHiCgCMc-fKlLPQdldzRx2EZowu2XSWg==
via
1.1 12c16baed6578bf50fb0eaa233f2bc84.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.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.36.232.106 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-36-232-106.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46: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
Thu, 20 Feb 2020 20:46: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/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
92.122.247.161 , France, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-247-161.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 20 Feb 2020 18:46:23 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
Thu, 20 Feb 2020 18:46:23 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/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
  • https://nugmw.userreport.com/rc-ap/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:7200:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
65651f0c924583ada4d7bad5b29fda11e6b43c4d908b58d0c03eaf8199a84e45

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 18e87eada05046c231b7f49230fa6dc4.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA53-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
1863
x-amz-cf-id
BOy-bnFQoUicWvmzYAqfoTiIUjeqyXbpNoNL_B08yF1cHOxRjk7NSA==

Redirect headers

date
Thu, 20 Feb 2020 18:46:22 GMT
via
1.1 f0a97a8c56cd2bb79a1739863489ed4c.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA6-C1
location
https://nugmw.userreport.com/rc-ap/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%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
0f3NCnRBc8m3P_Y8rVQ_f7GrOMcyFfygaD8idLrPnwhEkAJKV6t3wQ==
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.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:280::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
7036c5cd37e467a149892d8d26d5ffc2c5b6724b779f76c79cb65e466ac25a7a

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
content-encoding
gzip
x-amz-request-id
3E70F00CCC1A1D86
status
200
access-control-max-age
86400
content-length
2480
x-amz-id-2
wpw3NJLFDltAg0ZMplz+JQnFPu/w8On9TiZ1iAH3YfNRpmAzdbdBZ9LRFNbt8uEvZ1iNg/Y7XnY=
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=27098
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
collect
www.google-analytics.com/
35 B
110 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=3380307&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd21=manuell&cm17=1&cd18=3380307&z=477867715
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Sat, 01 Feb 2020 02:52:08 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1698854
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/downloads/irfanview/
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 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
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::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/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 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:817::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/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 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/r20200219/r20190131/
221 KB
83 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20200219/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:806::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0f1fe6829fb73f0beec9dcea8df0429a5a4b631884025d0c73b090d99d4d766b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:22 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
84535
x-xss-protection
0
server
cafe
etag
8272681897100820596
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Thu, 20 Feb 2020 18:46:22 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20200219/r20190131/ Frame 836E
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20200219/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:820::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/r20200219/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/downloads/irfanview/
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/downloads/irfanview/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Thu, 20 Feb 2020 01:55:47 GMT
expires
Thu, 05 Mar 2020 01:55:47 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
60635
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
user.module.js
www.giga.de/wp-content/plugins/core/basic/user/feature/static/js/
8 KB
2 KB
Script
General
Full URL
https://www.giga.de/wp-content/plugins/core/basic/user/feature/static/js/user.module.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
0ccc896f3f0394fd869e82a74ae54759f3181e636b59a71d5628a8e02b38019d

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 23:22:32 GMT
content-encoding
gzip
x-original-content-length
8606
server
nginx
status
200
etag
W/"5c9a42da-219e"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2023
expires
Thu, 26 Mar 2020 23:22:32 GMT
post-33dedcb970.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-33dedcb970.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
546390dabb77f8ffa37721249a74cd4ac7e117b65a2860d797821c14c16e3cab

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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, 14 Nov 2019 14:48:22 GMT
content-encoding
gzip
x-original-content-length
7105
server
nginx
status
200
etag
W/"5dcd68dc-1bc1"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2689
expires
Fri, 13 Nov 2020 14:48:22 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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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:34 GMT
content-encoding
gzip
x-original-content-length
54000
server
nginx
status
200
etag
W/"5d78bf3c-d2f0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
18237
expires
Thu, 10 Sep 2020 09:34:34 GMT
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=1187
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/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
via
1.1 google
cf-cache-status
HIT
age
546798
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
5682a499c9e8d6d1-FRA
expires
Sat, 13 Feb 2021 10:53:05 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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 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
image-gallery-ba2fa45248.js
www.giga.de/static-local/dist/assets/js/components/
1 KB
996 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/image-gallery-ba2fa45248.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
4ae5b9dce4c32ec8213b405a1d299395de6ead926b4e32d829109a100130e896

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 23:23:20 GMT
content-encoding
gzip
x-original-content-length
1290
server
nginx
status
200
etag
W/"5c9a4313-50a"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
700
expires
Thu, 26 Mar 2020 23:23:20 GMT
user-rating.module.js
www.giga.de/wp-content/plugins/core/features/user-rating/feature/static/js/
18 KB
4 KB
Script
General
Full URL
https://www.giga.de/wp-content/plugins/core/features/user-rating/feature/static/js/user-rating.module.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
f8896eaef0f0ab516d60952b49da1ce2e7922678db3edafabc24f90a8769634a

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 23:22:32 GMT
content-encoding
gzip
x-original-content-length
18609
server
nginx
status
200
etag
W/"5c9a42da-48b1"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
3631
expires
Thu, 26 Mar 2020 23:22:32 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%2Fdownloads%2Firfanview%2F&pid=CjewOZDhQB0iS&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.201.153 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-201-153.fra53.r.cloudfront.net
Software
Server /
Resource Hash
9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA53-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 f960fa0538fdb326fc338e984fa7ece9.cloudfront.net (CloudFront)
x-amz-cf-id
nm8bfn8bAEMRVjDa1nYpZz-2PNBcKF6qaAmGzPmWJJEbQrXQpoyHMA==
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.201.153 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-201-153.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:13:39 GMT
content-encoding
gzip
vary
Origin
age
1975
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 d01ad8df731d3f120823f9e20df55147.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53-C1
x-amz-cf-id
MOF-dFJjbrw78t5OZXdtCSfBRQfNtEE4gl3DKuoW3NHfmqVSsbEAmA==
videojs-c972511a.min.js
videos.giga.de/dist/js/embed/bundle/ Frame E031
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/172493?autoplay=1
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/172493?autoplay=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
script

Response headers

date
Thu, 20 Feb 2020 18:46:22 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 E031
268 KB
91 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/172493?autoplay=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a9c7ad529b5c6eb3d69125c84f573deed9198400d84bd2e0fafaff0a2e68469f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=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
script

Response headers

date
Thu, 20 Feb 2020 18:46:23 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
92989
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:23 GMT
videojs-c972511a.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 3227
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/172495?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5

Request headers

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

Response headers

date
Thu, 20 Feb 2020 18:46:23 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 3227
268 KB
91 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/172495?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a9c7ad529b5c6eb3d69125c84f573deed9198400d84bd2e0fafaff0a2e68469f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 20 Feb 2020 18:46:23 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
92989
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:23 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/downloads/irfanview/
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
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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, 05 Feb 2020 05:24:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
1344135
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
Thu, 04 Feb 2021 05:24:08 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame E031
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/172493?autoplay=1
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/172493?autoplay=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
style

Response headers

date
Thu, 20 Feb 2020 18:46:23 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 E031
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/172493?autoplay=1
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/172493?autoplay=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
image

Response headers

date
Thu, 20 Feb 2020 18:46:23 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
Wed, 20 May 2020 18:46:23 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 3227
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/172495?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813

Request headers

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

Response headers

date
Thu, 20 Feb 2020 18:46:23 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 3227
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/172495?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913

Request headers

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

Response headers

date
Thu, 20 Feb 2020 18:46:23 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
Wed, 20 May 2020 18:46:23 GMT
md5-8984469f61.js
www.giga.de/static-local/dist/assets/js/helper/
3 KB
2 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/helper/md5-8984469f61.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
8e1c26f07e47d2ae0bede45f5f426c0e7054732698b9d7a9ca2d7dc88f6ad23d

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 23:22:32 GMT
content-encoding
gzip
x-original-content-length
3325
server
nginx
status
200
etag
W/"5c9a4313-cfd"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
1332
expires
Thu, 26 Mar 2020 23:22:32 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%2Fdownloads%2Firfanview%2F&__id=1582224383000&__it=-60&__ic=727391&__iq=ce622a7cc3514b522a3d6b39652425fb&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 GMT
Last-Modified
Fri, 12 Feb 2010 18:44:16 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
Thu, 14 Feb 2013 18:44:16 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
119 KB
22 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/bundle/post-33dedcb970.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
8362b4d06074b9fc35645e277fa5260a7a9295e51f5a6a8d2b817c08ded55b8b

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
tMBQsXgkpWXw2_psZ1eUE6_kbbo4zkGn
content-encoding
gzip
age
67
x-cache
HIT
status
200
date
Thu, 20 Feb 2020 18:46:23 GMT
content-length
22748
x-amz-id-2
6dZgyDobWhJC1SlAPP7IHHXOshFq9JNxCgPUb2Cn316xHkn5JV6dxvE+r3QQhiVNgCd66BE6cn8=
x-served-by
cache-hhn4020-HHN
last-modified
Tue, 18 Feb 2020 14:35:33 GMT
server
AmazonS3
x-timer
S1582224383.017115,VS0,VE0
etag
"b3c6cb22c0aed7d5bd2cb078ba2824c9"
vary
Accept-Encoding
x-amz-request-id
B1F79BCB75B530DF
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
57
x-cache-hits
13
ads
googleads.g.doubleclick.net/pagead/ Frame 76F0
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=250&slotname=9921598555&adk=2154913067&adf=2485742297&w=300&lmt=1582224383&psa=0&guci=1.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&flash=0&wgl=1&adsid=NT&dt=1582224382932&bpp=16&bdt=372&fdt=87&idt=87&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5725820942077&frm=20&pv=2&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=52843133006798&dssz=67&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=561&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065304%2C44714237&oid=3&pvsid=1056494168406379&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CleE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=7uMG0xRID4&p=https%3A//www.giga.de&dtd=102
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200219/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::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=250&slotname=9921598555&adk=2154913067&adf=2485742297&w=300&lmt=1582224383&psa=0&guci=1.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&flash=0&wgl=1&adsid=NT&dt=1582224382932&bpp=16&bdt=372&fdt=87&idt=87&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5725820942077&frm=20&pv=2&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=52843133006798&dssz=67&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=561&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065304%2C44714237&oid=3&pvsid=1056494168406379&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CleE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=7uMG0xRID4&p=https%3A//www.giga.de&dtd=102
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/downloads/irfanview/
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/downloads/irfanview/

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
Thu, 20 Feb 2020 18:46:23 GMT
server
cafe
content-length
22554
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 20-Feb-2020 19:01:23 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
Thu, 20 Feb 2020 18:46:23 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/r20200219/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
753def12fae8722bef366a340b5ab7c34a15c8cd8432cdddb30d8f91ab987b96
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582122122802407"
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
27674
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:23 GMT
photoswipe-ui-default-06489ae894.min.js
www.giga.de/static-local/dist/assets/js/vendor/photoswipe/
10 KB
4 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/photoswipe/photoswipe-ui-default-06489ae894.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
12fc096219ba602c4dc4ff0b88c55300ad603f3722ca0ea843d051c77b6dc366

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 23:23:20 GMT
content-encoding
gzip
x-original-content-length
9866
server
nginx
status
200
etag
W/"5c9a4313-268a"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
3733
expires
Thu, 26 Mar 2020 23:23:20 GMT
dmp
tracking.m6r.eu/sync/
86 B
612 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
92.122.247.161 , France, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-247-161.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
ce35bf766dd37eae65f800a69b58741253b738644a9fb03704536fd77a437f8e

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 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
99
ads
googleads.g.doubleclick.net/pagead/ Frame 84EA
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1582224383&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%2Fdownloads%2Firfanview%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582224382948&bpp=3&bdt=389&fdt=130&idt=130&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=300x250&nras=1&correlator=5725820942077&frm=20&pv=1&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=211372532027198&dssz=69&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=21065304%2C44714237&oid=3&pvsid=1056494168406379&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=136
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200219/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::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=1582224383&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%2Fdownloads%2Firfanview%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582224382948&bpp=3&bdt=389&fdt=130&idt=130&shv=r20200219&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=300x250&nras=1&correlator=5725820942077&frm=20&pv=1&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&ga_fc=0&iag=0&icsg=211372532027198&dssz=69&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=21065304%2C44714237&oid=3&pvsid=1056494168406379&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=136
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/downloads/irfanview/
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/downloads/irfanview/

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
Thu, 20 Feb 2020 18:46:23 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 20-Feb-2020 19:01:23 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
Thu, 20 Feb 2020 18:46:23 GMT
cache-control
private
bootstrap.min.js
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
36 KB
10 KB
Script
General
Full URL
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
209.197.3.15 Phoenix, United States, ASN20446 (HIGHWINDS3, US),
Reverse DNS
vip0x00f.map2.ssl.hwcdn.net
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 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
pubads_impl_2020013001.js
securepubads.g.doubleclick.net/gpt/
167 KB
61 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.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.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
sffe /
Resource Hash
06349254c3a3832ea81973863ce5873ab441c1b8006ee1cb553425d152fabf88
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 30 Jan 2020 14:09:03 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
62230
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:23 GMT
photoswipe-9c448861a8.min.js
www.giga.de/static-local/dist/assets/js/vendor/photoswipe/
31 KB
12 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/photoswipe/photoswipe-9c448861a8.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
64e5bd2d8be02e17d12abd1b71fed709654b929f9af050817861f375a7421ac9

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 23:23:21 GMT
content-encoding
gzip
x-original-content-length
31813
server
nginx
status
200
etag
W/"5c9a4313-7c45"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
12136
expires
Thu, 26 Mar 2020 23:23:21 GMT
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/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 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
impl.20200218-15-RELEASE.js
cdn.taboola.com/libtrc/
441 KB
125 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20200218-15-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
36120315ac48cb331f54bbc978490bfa3ce4fec82cc3853d070ef7bb1a806755

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
RNhYOmXru5KW1VimHg_7Waw1Pp.6Nvmw
content-encoding
gzip
age
120
x-cache
HIT
status
200
date
Thu, 20 Feb 2020 18:46:23 GMT
x-amz-replication-status
PENDING
content-length
127274
x-amz-id-2
pZujaHRJL2Cs5QP7v/IbUdF0k7hBWiFVkBWzfRqnPZjjU7tJIFyiCoRWjw7lgQva7u0elkO1m9o=
x-served-by
cache-hhn4020-HHN
last-modified
Tue, 18 Feb 2020 14:20:44 GMT
server
AmazonS3
x-timer
S1582224383.184221,VS0,VE0
etag
"3faf07a1bc23d13f58c9886f6518a0d4"
vary
Accept-Encoding
x-amz-request-id
8865F4E763A0707B
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
96
x-cache-hits
1188
beacon.js
sb.scorecardresearch.com/
1 KB
1 KB
Script
General
Full URL
https://sb.scorecardresearch.com/beacon.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.85.250.71 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a104-85-250-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 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
Fri, 21 Feb 2020 18:46:23 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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 GMT
submit
lb75.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb75.s400.meetrics.net/bb-mx/submit?/bJUDBRAAA+whFoo0F0wFz6BvvA33F3uBnpFnhFukElvBkvF3uFsvFhkFzvBpyFmhFu2FplF3vBfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSbgCPAAAAAAAAAOAAAAGBAAAAAAZwSbgCBRksFAQtjFJOAzSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Thu, 20 Feb 2020 18:46:22 GMT
data
lb75.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb75.s400.meetrics.net/data?/bJUDCRAAATkzFARksFAQtjFoqJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 20-Feb-20 18:46:22 GMT
nuggad
ih.adscale.de/
49 B
283 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=2&d10=4&d2=4&d4=3&d11=0&d8=1&d9=2&d12=4&d1=1&d3=3
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.124.22.230 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-3-124-22-230.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 GMT
server
Apache-Coyote/1.1
p3p
CP=NOI PSA OUR
content-length
49
content-type
image/gif
nativendo.css
c.nativendo.de/cdn/asset/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1187
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1187
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
092fe41367a1374567b0892180ec5a1f17a60675613d3cfc8423fe99e5cd2c93

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 google
cf-cache-status
HIT
age
546798
cf-polished
origSize=6590
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
5682a49b7f24d6d1-FRA
expires
Sat, 13 Feb 2021 10:53:05 GMT
collect
www.google-analytics.com/
35 B
110 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=172495%20--%20winload-irfanview-plugins-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172495&cd12=PRESS&cd13=93&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=0&cm1=1&z=1811885569
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Sat, 01 Feb 2020 02:52:08 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1698855
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
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame F964
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.94.216.48 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/downloads/irfanview/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Cookie
ad-id=AyKK9fJzvkoJtDtwQibdAYw|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/downloads/irfanview/

Response headers

Server
Server
Date
Thu, 20 Feb 2020 18:46:23 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=AyKK9fJzvkoJtDtwQibdAYw; Domain=.amazon-adsystem.com; Expires=Thu, 01-Oct-2020 18:46:23 GMT; Path=/; Secure; HttpOnly; SameSite=None ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Tue, 01-Apr-2025 18:46:23 GMT; Path=/; Secure; HttpOnly; SameSite=None
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Thu, 20 Feb 2020 18:46:23 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=AyKK9fJzvkoJtDtwQibdAYw|t; Domain=.amazon-adsystem.com; Expires=Thu, 01-Oct-2020 18:46:23 GMT; Path=/; Secure; HttpOnly; SameSite=None
Vary
User-Agent
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&cm1=1&z=1058641089
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Sat, 01 Feb 2020 02:52:08 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1698855
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
ads
securepubads.g.doubleclick.net/gampad/
13 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=800x450%7C580x500%7C580x360%7C480x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&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%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%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%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383347&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3608214049&uci=1&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&dssz=75&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=596x0&msz=800x450&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
cafe /
Resource Hash
b86419a02bd57b326f54607a5d3e298a99a9d6dd93cf0d3b0231f45c04c4c2da
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 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
4617
x-xss-protection
0
google-lineitem-id
5002100619
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138265057624
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2020013001.js
securepubads.g.doubleclick.net/gpt/
66 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
sffe /
Resource Hash
ebe54c2b4cdb3fc0bd7bd45b2ce574428f0e970bdd1e9395f50916bce1628cc6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 30 Jan 2020 14:09:03 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
24903
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:23 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_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=1x1&ists=1&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%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%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%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383357&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2830864137&uci=2&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&dssz=76&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
cafe /
Resource Hash
d909950e23c968f5a3e2d18d4c80b65f2b089157b3fe78141de8659c539d909b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 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
1682
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
json
trc.taboola.com/stroeer-smb-giga/trc/3/
13 KB
6 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=19%3A46%3A23.475&lti=deflated&data=%7B%22id%22%3A601%2C%22ii%22%3A%22%2Fdownloads%2Firfanview%22%2C%22it%22%3A%22category%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1582224382986%2C%22cv%22%3A%2220200218-15-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%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%3A10267%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-c2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Download%20Thumbnails%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Download%20Thumbnails%20-%20Video%22%2C%22cd%22%3A5393.875%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.20200218-15-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
nginx /
Resource Hash
c7c7935d9d94246d3e76bcda7e6d38a2166b8e66745839a78cb625fda8d933e3

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
309
date
Thu, 20 Feb 2020 18:46:23 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-fra19148-FRA
server
nginx
x-timer
S1582224383.488716,VS0,VE309
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
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&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_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%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%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%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%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%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383497&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1008420861&uci=3&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&dssz=77&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
cafe /
Resource Hash
b893f28293429077c17d50c1ad8bba0a52e1ece5786e049e6974219e95d4c3b5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 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
3303
x-xss-protection
0
google-lineitem-id
5303510603
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138303782956
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/
14 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&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_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%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse&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%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%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%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383502&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2889272997&uci=4&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&dssz=77&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
cafe /
Resource Hash
ccc542b9e603f4053ef6ebb98e7bd00d952839a21650d82d93b5c669716f3778
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 GMT
content-encoding
br
x-content-type-options
nosniff
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
8324
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
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/
17 KB
9 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1056494168406379&correlator=2111328225440517&output=ldjh&impl=fif&adsid=NT&eid=21062414%2C21063636%2C21065432%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=4444%2Fgiga.de_sd%2Fsoftware_produktseite&sz=10x20%7C10x10%7C300x250%7C34x31&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_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%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%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%3DSoftware-File%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D2%26smb-hour%3D19%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%26nuggad%3Dn127-0%252Cn121-2%252Cn42-1%252Cn116-0%252Cn24-1%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn2-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-1%252Cn36-1%252Cn119-2%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-1%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-0%252Cn26-1%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-0%252Cn6-1%252Cn63-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-2%252Cn90-0%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-4%252Cn3-1%252Cn82-1%252Cn59-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-2%252Cn67-2%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%252Cn144-1%252Cn132-4%252Cn133-1%26mbrid%3D86421fabd0db152b1e74d1a98349514f%26mbrseg%3Dff6482ed%252Cb3838f1f%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1582224383&dt=1582224383506&dlt=1582224382559&idt=771&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=625271203&uci=5&ifi=6&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%2Fdownloads%2Firfanview%2F&dssz=77&icsg=68172670516402&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=238248099.1582224383&ga_sid=1582224383&ga_hid=139742495&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
cafe /
Resource Hash
27b10092a55d2f9c6e69c6658af3b821a3abfe8c39560e98ac3680decad04a1d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 GMT
content-encoding
br
x-content-type-options
nosniff
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
9106
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
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
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:23 GMT
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9=
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9=
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.85.250.71 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a104-85-250-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (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
Thu, 20 Feb 2020 18:46:23 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=1582224383512&ns_c=UTF-8&cv=3.5&c8=IrfanView%20Download&c7=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&c9=
Pragma
no-cache
Date
Thu, 20 Feb 2020 18:46:23 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
config.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.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
94fcc6c435deb16c5aa8c203f943306bd70b815ff2f1352186839727b550498e

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
Content-Encoding
gzip
Age
1423
X-Cache
HIT
Connection
keep-alive
Content-Length
8270
x-amz-id-2
T4PrSNFh6iJ1w5H0I1T4xQfnxEDvpwnQj9r2A2z72RCLOiH9/EXziV6CK1hr2e5TKi3VHjblmR0=
X-Served-By
cache-fra19138-FRA
Last-Modified
Thu, 20 Feb 2020 17:14:55 GMT
Server
AmazonS3
X-Timer
S1582224384.580464,VS0,VE0
ETag
"a8a7b34eacd8b1fcfca068a125394781"
x-amz-request-id
5262D4011FE1A01D
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
3352
/
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%2Fdownloads%2Firfanview%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1187
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
885077143dfd6b349963d8744ff08b803d3a66495c3ae47598083bded08546c2

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 GMT
content-encoding
gzip
last-modified
Thu, 20 Feb 2020 18:46:23 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
694
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/202002111741/
37 KB
14 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/202002111741/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
54a5f6b6e229bcae1a84f6c08614287d0770c96b7d2cfeffe9da6c6c90df2364

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
Content-Encoding
gzip
Age
42
X-Cache
HIT
Connection
keep-alive
Content-Length
13451
x-amz-id-2
PY1IRbrB9wkfSP+l1I6oV0fTGQLpHtbxEyRRVghLeRbZmGKdJzxrShsbikygHzYtrsHOS61kerM=
X-Served-By
cache-fra19138-FRA
Last-Modified
Thu, 13 Feb 2020 21:03:50 GMT
Server
AmazonS3
X-Timer
S1582224384.607050,VS0,VE0
ETag
"c719a162b103ae2c7d189335197ab2f8"
x-amz-request-id
A91C187FB11F9C91
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
93
userx.20200218-15-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20200218-15-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
fe87c9ed3ae9c73712c5484f1963b6d7e19ba5c48c51742f1bc5a84ac1dbc224

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
_kUrqH.1XNm7Z9hiAjSc9Ggq.vjqWa88
content-encoding
gzip
age
95
x-cache
HIT
status
200
date
Thu, 20 Feb 2020 18:46:23 GMT
x-amz-replication-status
COMPLETED
content-length
7712
x-amz-id-2
yYKj/EtkHAtG+MzYO/nG+XuXvLrUAsFDDLmAioQob4JZ4COiy12XrNUN4bR86gXnbHcm4D72/t8=
x-served-by
cache-hhn4020-HHN
last-modified
Tue, 18 Feb 2020 14:20:52 GMT
server
AmazonS3
x-timer
S1582224384.841338,VS0,VE0
etag
"12aeb091867f4ad98b02d7ca2874df41"
vary
Accept-Encoding
x-amz-request-id
43AC8A5659EEB70B
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
12
x-cache-hits
231
rtb-h
trc.taboola.com/sg/exposebox-network/1/ Frame B997
Redirect Chain
  • https://server.exposebox.com/rcm
  • https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_isttm14
0
54 B
Image
General
Full URL
https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_isttm14
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.928357,VS0,VE8
x-served-by
cache-fra19148-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

date
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 google
x-powered-by
Express
location
//trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_isttm14
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 B997
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=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
  • https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&tbid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&query=taboola_hm%3D3039d8fe-e21d-...
  • https://match.zorosrv.com/match?tabid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&extuid=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&excid=218&query=taboola_hm%3D3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
0
293 B
Image
General
Full URL
https://match.zorosrv.com/match?tabid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&extuid=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&excid=218&query=taboola_hm%3D3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.099704,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-fra19152-FRA

Redirect headers

date
Thu, 20 Feb 2020 18:46:24 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.066475,VS0,VE9
location
https://match.zorosrv.com/match?tabid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&extuid=3039d8fe-e21d-4ec6-b1b5-b3c333d5a398&excid=218&query=taboola_hm%3D3039d8fe-e21d-4ec6-b1b5-b3c333d5a398
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19152-FRA
sync.php
pixel.rubiconproject.com/exchange/ Frame B997
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/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
69.173.144.139 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
a66cbf3142c6ef39e3614b84a34262cf
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame B997
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=N014F5_mY-JBihXLyWhUljabGIEPkgrP_TmaC93_kjc%3D
45 B
108 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=N014F5_mY-JBihXLyWhUljabGIEPkgrP_TmaC93_kjc%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
9
date
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.926613,VS0,VE9
x-served-by
cache-fra19148-FRA
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=N014F5_mY-JBihXLyWhUljabGIEPkgrP_TmaC93_kjc%3D
Date
Thu, 20 Feb 2020 18:46:23 GMT
Server
nginx
Connection
close
Etag
"N014F5_mY-JBihXLyWhUljabGIEPkgrP_TmaC93_kjc="
Content-Length
0
/
trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/ Frame B997
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=15265e4e-d3ff-4d00-82ae-a3b192fed12a
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=15265e4e-d3ff-4d00-82ae-a3b192fed12a
0
59 B
Image
General
Full URL
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=15265e4e-d3ff-4d00-82ae-a3b192fed12a
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
21
date
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.929811,VS0,VE21
x-served-by
cache-fra19148-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

Date
Thu, 20 Feb 2020 18:46:23 GMT
Server
MT3 2129 8dd2d16 master cdg-pixel-x14
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=15265e4e-d3ff-4d00-82ae-a3b192fed12a
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Keep-Alive
timeout=360
Content-Length
0
Expires
Thu, 20 Feb 2020 18:46:22 GMT
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/ Frame B997
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=TasGYLF52Y6u&ev=1&pid=562107
0
112 B
Image
General
Full URL
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=TasGYLF52Y6u&ev=1&pid=562107
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
11
date
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.917758,VS0,VE11
x-served-by
cache-fra19148-FRA
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=TasGYLF52Y6u&ev=1&pid=562107
content-language
en-US
status
302
cache-control
private, max-age=0, no-cache, no-store
cw-server
bh-deployment-stage-0
expires
-1
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/ Frame B997
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=A2RPvMNPzKkOr3BKERih&pi=taboola&tc=1
0
51 B
Image
General
Full URL
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=A2RPvMNPzKkOr3BKERih&pi=taboola&tc=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.929874,VS0,VE9
x-served-by
cache-fra19148-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

status
302
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:23 GMT, Thu, 20 Feb 2020 18:46:23 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=A2RPvMNPzKkOr3BKERih&pi=taboola&tc=1
expires
Thu, 01 Jan 1970 00:00:00 GMT
getuidnb
ib.adnxs.com/ Frame B997
43 B
690 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.203 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
317.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
Thu, 20 Feb 2020 18:46:25 GMT
AN-X-Request-Uuid
ed3c8d07-94c0-418d-b9d4-0bd3e247117b
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.107.83.77; 185.107.83.77; 317.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.37: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 B997
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=CAESEGnKKKJq17pYqyipNDARnAk&google_cver=1
0
70 B
Image
General
Full URL
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEGnKKKJq17pYqyipNDARnAk&google_cver=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
12
date
Thu, 20 Feb 2020 18:46:23 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.892147,VS0,VE12
x-served-by
cache-fra19148-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

pragma
no-cache
date
Thu, 20 Feb 2020 18:46:23 GMT
server
HTTP server (unknown)
location
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEGnKKKJq17pYqyipNDARnAk&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 B997
43 B
691 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.203 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
317.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
Thu, 20 Feb 2020 18:46:25 GMT
AN-X-Request-Uuid
901d588d-585c-48ad-90c4-cbf34a4bbca2
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.107.83.77; 185.107.83.77; 317.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.137: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 B997
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=cb6ec19e-32c5-4819-a61d-d2b1b34ca6ad
0
201 B
Image
General
Full URL
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=cb6ec19e-32c5-4819-a61d-d2b1b34ca6ad
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
Thu, 20 Feb 2020 18:46:24 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224384.022026,VS0,VE9
x-served-by
cache-fra19148-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

pragma
no-cache
date
Thu, 20 Feb 2020 18:46:23 GMT
x-aspnet-version
4.0.30319
location
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=cb6ec19e-32c5-4819-a61d-d2b1b34ca6ad
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 B997
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
0
55 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/downloads/irfanview/
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
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
11
date
Thu, 20 Feb 2020 18:46:29 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224389.473259,VS0,VE11
x-served-by
cache-fra19148-FRA
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 B997
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/downloads/irfanview/
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
Track001-dc3
Pragma
no-cache
Date
Thu, 20 Feb 2020 18:46:26 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 B997
0
176 B
Image
General
Full URL
https://cds.taboola.com/?uid=a27582e6-5d4a-4a15-8322-e2458621be0d-tuct548597f&_r=8067147
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:29 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 B997
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://ads.betweendigital.com/match?bidder_id=43092&callback_url=https%3A%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D429%26user_id%3D%24%7BUSER_ID%7D%26ssp%3Dtaboola%26expires%3D30
  • https://ads.betweendigital.com/match?bidder_id=43092&callback_url=https%3A%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D429%26user_id%3D%24%7BUSER_ID%7D%26ssp%3Dtaboola%26expires%3D30&crf=1
  • https://x.bidswitch.net/sync?dsp_id=429&user_id=238f4027-9e91-3820-9c54-f0af531656b1&ssp=taboola&expires=30
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cf90a98-1a4f-412a-bcd7-27661d6d41b2
0
201 B
Image
General
Full URL
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cf90a98-1a4f-412a-bcd7-27661d6d41b2
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
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
Thu, 20 Feb 2020 18:46:29 GMT
via
1.1 varnish
server
nginx
x-timer
S1582224389.340234,VS0,VE9
x-served-by
cache-fra19148-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

status
302
date
Thu, 20 Feb 2020 18:46:29 GMT
cache-control
no-cache, no-store, must-revalidate
content-length
0
location
//trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cf90a98-1a4f-412a-bcd7-27661d6d41b2
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
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Download%20Thumbnails%20-%20Video&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cm12=1&cm14=1&z=2102851306
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Sat, 01 Feb 2020 02:52:08 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1698855
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
182de4c2-ebef-4d48-bcdb-1072c47e1a6a.png
cdn.taboola.com/static/18/
161 B
421 B
Image
General
Full URL
https://cdn.taboola.com/static/18/182de4c2-ebef-4d48-bcdb-1072c47e1a6a.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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
c6fd91eaab2f73592123d6b2759edb96ab94d8b205c86d5bd3e6afe6978100b8

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
11hKs_ZY1Oj..UWCAzSy.3CErYlRJODU
via
1.1 varnish
age
27369
x-cache
HIT
status
200
date
Thu, 20 Feb 2020 18:46:23 GMT
x-amz-replication-status
COMPLETED
content-length
161
x-amz-id-2
nYTY4eLltkPvclGNjZ6kbV3otMpvampsuhAmUfzmUPRc3ax/vxPtO2BrQtoOE6tU0Rqdd/KJ6Vo=
x-served-by
cache-hhn4020-HHN
last-modified
Mon, 31 Oct 2016 13:00:36 GMT
server
AmazonS3
x-timer
S1582224384.845789,VS0,VE0
etag
"2e516cd5998a92bd07e7e5548b6a90c4"
x-amz-request-id
C462F0551F9CA7EE
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
12
x-cache-hits
5356
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame EA5A
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvn8xcJcmUuLnnbFq6nGTaoYQGWO9xYossu092-CX713GM6y698_VD5CUY2bSwh48Uu5BTr3--BoiMjY18oArZxxQyWVIcJGccTLK13zNJK7hRTdd2PrEOvHXIFAFQEyl7FTg_CEgddz...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
343 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:280::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 20 Feb 2020 18:46:23 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=580090
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Thu, 27 Feb 2020 11:54:33 GMT

Redirect headers

date
Thu, 20 Feb 2020 18:46:23 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
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
101 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.20200218-15-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
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
10
date
Thu, 20 Feb 2020 18:46:23 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-fra19148-FRA
pragma
no-cache
server
nginx
x-timer
S1582224384.873280,VS0,VE10
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
view
securepubads.g.doubleclick.net/pcs/ Frame BBED
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstYIe5PMP5jXMNZ-E6kBuRWKP_urPz0P-VwFTBbj_P68GubIa-rA8t-fVA0aF-vkz29SpASlAM4swGeSo4Are0FM1THTd25Mde0BFTtdDwYDQmkle2KHTc0SRkxVijqc0zDlhwoU6d3JlTNTvz9xIXk9ZJdNI0xdSlHplz7AEwyYel63jjFJXeFqZ35Zquj1HHw14_HNl_Cz8ZhDwYqvSPkXEDzjHmZ8pFkjdVUJOOcBh0Y_9SjwImx_I9gVpUU8Wk11daI0oRmoAbtdp8FdM-eRzEQ2HDp&sig=Cg0ArKJSzKOhtKxPcKU9EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:23 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
video.php
media.oadts.com/www/delivery/ Frame BBED
108 KB
108 KB
Script
General
Full URL
https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
3702a5c29c45e797736566a441f88528e6221205870110238032ba569bc41b79

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:25 GMT
Cache-Control
private, max-age=0, no-cache
Expires
Mon, 26 Jul 1997 05:00:00 GMT
Server
lighttpd/1.4.45
Content-Length
110442
Content-type
text/javascript; charset=UTF-8
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame BBED
71 KB
27 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_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
0b7f95ea376c84f25dd1359009f53c0a00a2999c897fde63e84d8384c019f614
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582122122802407"
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
27379
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:23 GMT
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
616 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.20200218-15-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/downloads/irfanview/
User-Agent
Mozilla/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
11738
x-cache
HIT
status
200
date
Thu, 20 Feb 2020 18:46:23 GMT
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
grODyaFUyHwi27S6u2hd746yPHwUf+y1im5Wn93DxT7wozhn8KMFUP712WAAG3eD1t2rnF4k3Bs=
x-served-by
cache-hhn4020-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
S1582224384.899571,VS0,VE0
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
x-amz-request-id
29D722C296265892
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
12
x-cache-hits
24679
container
tracking.m6r.eu/pixel/
0
399 B
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
92.122.247.161 , France, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-247-161.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 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
0
Content-Type
text/javascript; charset=utf-8
container
tracking.m6r.eu/pixel/
0
399 B
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n121=2&n42=1&n116=0&n24=1&n104=0&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n13=1&n125=0&n8=4&n2=4&n137=0&n101=0&n108=0&n54=0&n110=0&n87=0&n149=0&n76=1&n66=0&n139=1&n160=0&n107=0&n21=1&n51=1&n117=4&n86=0&n147=4&n64=1&n36=1&n119=2&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=1&n128=1&n118=3&n85=0&n9=0&n6=1&n63=1&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=2&n90=0&n142=0&n7=2&n103=0&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=4&n3=1&n82=1&n59=1&n84=0&n5=3&n109=0&n122=2&n67=2&n115=1&n89=2&n123=1&n17=1&n78=0&n81=1&n88=0&n39=1&n156=1&n148=0&n144=1&n132=4&n133=1
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
92.122.247.161 , France, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-247-161.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 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
0
Content-Type
text/javascript; charset=utf-8
view
securepubads.g.doubleclick.net/pcs/ Frame 7A4C
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstPGai1J1otUh669d1gj6Syvo54sgJWb3SotQFL3A2Je7Ll4yrLZeDjo4nV-8XSUKTVqiudOqz10fYJlhOedQWirE90vydDuQHQNZCq63UfDlk00PCx1EIyxlu8Jsh7fnwsjxO0tYP-qYFox06Jr4ZZFmzCXI0JsGnXAwERX50OKEmtrojruN_lDmhxRuSvPM6eu-KxTKhuSeGY_ClTc-OXaiSyrlIYwiF2fXYsxt7zgXm7p0nOjlwF2yGVpaqRYn7AgqpFNnz4HlmrtBmxe7DczCyK&sig=Cg0ArKJSzAa37o-pJpEmEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:24 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 7A4C
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_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
5942fe1a6c99120ec11cb98230cd557a5bfe60e98466dd96824a036d80a78aa3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"433 / 229 of 1000 / last-modified: 1582218842"
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
14492
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:24 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 7A4C
71 KB
27 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_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
0b7f95ea376c84f25dd1359009f53c0a00a2999c897fde63e84d8384c019f614
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582122122802407"
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
27379
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:24 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
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 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_2020021802.js
securepubads.g.doubleclick.net/gpt/ Frame 7A4C
167 KB
61 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021802.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.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
sffe /
Resource Hash
06c08e3ba81a0a899a551a554791954c7b40ff431de2c6a206e166617578903d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 18 Feb 2020 20:41:43 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
62262
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:24 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 7A4C
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:817::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/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 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 7A4C
20 KB
10 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=389069262003290&correlator=45208986564971&output=ldjh&impl=fif&eid=21065570%2C21065517%2C21064523%2C21065304&vrg=2020021802&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200220&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-728x90&sz=728x90&eri=6&cookie=ID%3Dc31ac7043b2cde9b%3AT%3D1582224383%3AS%3DALNI_MbZ00XRLmOHLR9d_kthfshHpVrj5Q&cdm=www.giga.de&bc=31&abxe=1&lmt=1582224384&dt=1582224384198&dlt=1582224384107&idt=80&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adx=429&ady=125&adk=4143599050&uci=oe2s0vn92us2&ifi=1&ifk=1641118334&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%2Fdownloads%2Firfanview%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=238248099.1582224383&ga_sid=1582224384&ga_hid=84226161&fws=256&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021802.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
cafe /
Resource Hash
1c1eab6817bfe0b9c7755066621ade487a59992e0c82af97cadfab2fd1d230b4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 GMT
content-encoding
br
x-content-type-options
nosniff
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
10017
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
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_2020021802.js
securepubads.g.doubleclick.net/gpt/ Frame 7A4C
66 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020021802.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021802.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.66 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s25-in-f2.1e100.net
Software
sffe /
Resource Hash
1a36f0a6f239c7826ac18991fae20560138d016bbd336c5e5156b9ef15ebf523
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 18 Feb 2020 20:41:43 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
24891
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:24 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 7A4C
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_2020021802.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 7A4C
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
19e45c5dde15bf9a8ca4352e4a29d79efe7ac02e80ac01ddfb8f6cf1fa27f4a1

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
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 GMT
51909d77-cbe1-464d-8b3e-850899fffa84
https://videos.giga.de/ Frame 3227
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/51909d77-cbe1-464d-8b3e-850899fffa84
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
9c760f4a3c7b447e8388337431_ciA2NTADN2E5NjRjNGU4MzM=.jpg
files.giga-video.de/70/7a/6a/ Frame 3227
20 KB
20 KB
Image
General
Full URL
https://files.giga-video.de/70/7a/6a/9c760f4a3c7b447e8388337431_ciA2NTADN2E5NjRjNGU4MzM=.jpg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
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
c2c3c67c656f5bbacc8a2b3c93a33be25d48ffc482ac0276bffda46b59c1b1e3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Tue, 18 Feb 2020 07:38:31 GMT
x-content-type-options
nosniff
age
212873
filer-source
e690a0968d0d4a41b01a2a8e4455f0b6a7d869099812e3fbac0bbae3f3ff2c04
x-cache
HIT
status
200
accept-language
bytes
content-length
20329
x-xss-protection
1; mode=block
last-modified
Tue, 18 Feb 2020 07:38:31 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
Thu, 19 Mar 2020 07:38:31 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 3227
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.75.27 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/172495?autoplay=0
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
Thu, 20 Feb 2020 18:46:25 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
F977F8B10CB18D48
Content-Length
53
x-amz-id-2
IMIOxhNr2XegCwNvMbKbEHsko6dRuOeFKNV7XiOF8S+LCHi6tegJ3giQGO/h9ay433lQHbY7JAw=
Last-Modified
Thu, 20 Feb 2020 14:21:06 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 3227
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/172495?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

date
Thu, 20 Feb 2020 18:46:24 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
Thu, 20 Feb 2020 19:01:24 GMT
b0eb3273-1025-4505-94ff-fc978e8d3c8f
https://videos.giga.de/ Frame E031
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/b0eb3273-1025-4505-94ff-fc978e8d3c8f
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 E031
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.75.27 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/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:25 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
8B7145C76BB7E62B
Content-Length
53
x-amz-id-2
tV4u6xHB0GCvNM0+iEVnSbmHQQbSWFwrlK/2hCs18YK30JrmeAKLYISfxxkcycHvvIDFGsTBax4=
Last-Modified
Thu, 20 Feb 2020 14:21:06 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 E031
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/172493?autoplay=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
empty

Response headers

date
Thu, 20 Feb 2020 18:46:24 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
Thu, 20 Feb 2020 19:01:24 GMT
data
lb75.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb75.s400.meetrics.net/data?/bJUDDlRAAKktFLkqFFlqwF23A52AwwA/k0FREmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2BELlnFBUkzFnBPeLAAAAAAABmEYAPBAAFAAmEYTA5iAPAAAAAAFrCBA5iAZBAAOA55A55A85B55A58E55A55AFA54A15A4BErA5iAPTDAAAAFrCHA5iASksFhFjAAAAAAAAAAAAEAAAmEYAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA6AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGvF10FfvFmfFwhFnlFdAAAFrCxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFHjWPUA
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:24 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 20-Feb-20 18:46:23 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 3227
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
143.204.202.68 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-68.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/172495?autoplay=0
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
Thu, 20 Feb 2020 18:46:17 GMT
Via
1.1 997f66fda0069dac50a85c7a4fa51b7e.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
27
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
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
nZghQy1wHN2xu3ErE05x-qtuA98WSmUvcJSdvJm0qI5Ld4Kbx6WbTg==
Expires
0
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame E031
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
143.204.202.68 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-68.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:17 GMT
Via
1.1 997f66fda0069dac50a85c7a4fa51b7e.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
27
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
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
Jg_MAn_mYknNcQjH0RD-kxlVXFg4ZaZvkLGRTCIdQCg9J5HWgxK2bg==
Expires
0
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 0DBC
0
0
Document
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_rendering_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::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
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/downloads/irfanview/
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/downloads/irfanview/

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, 20 Feb 2020 18:26:45 GMT
expires
Fri, 19 Feb 2021 18:26:45 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
1179
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
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 3227
201 KB
59 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=mjMYVUZQRh
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
143.204.202.68 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-68.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
a9942f14fec918d4846d7a42de72ff8e171df54463653663d823b5a20fedf007

Request headers

Referer
https://videos.giga.de/embed/172495?autoplay=0
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
Thu, 20 Feb 2020 18:45:32 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
86
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://videos.giga.de
Last-Modified
Wed, 19 Feb 2020 09:59:30 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 997f66fda0069dac50a85c7a4fa51b7e.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA53-C1
X-Amz-Cf-Id
-bY1tETVDdkjeIKTENU80vk8b0Akxhj7ccl49V1T2OF0Gr1xqsK4xg==
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame E031
201 KB
59 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=qSQATcPlPM
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
143.204.202.68 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-68.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
a9942f14fec918d4846d7a42de72ff8e171df54463653663d823b5a20fedf007

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:45:31 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
86
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://videos.giga.de
Last-Modified
Wed, 19 Feb 2020 09:59:30 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 c5c25772c7f14e267596e0f8ce51d9bc.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA53-C1
X-Amz-Cf-Id
Xex5rBb_WWdTUiOJECidx3hOq3AmZJicwZcyoMlHNCV7GxIFGr8tMw==
truncated
/ Frame 3227
201 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a9942f14fec918d4846d7a42de72ff8e171df54463653663d823b5a20fedf007

Request headers

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

Response headers

Content-Type
text/javascript
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 3B3C
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_2020021802.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::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/downloads/irfanview/
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/downloads/irfanview/

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, 20 Feb 2020 11:46:30 GMT
expires
Fri, 19 Feb 2021 11:46:30 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
25194
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 7A4C
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_2020021802.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
753def12fae8722bef366a340b5ab7c34a15c8cd8432cdddb30d8f91ab987b96
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582122122802407"
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
27674
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:24 GMT
truncated
/ Frame E031
201 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a9942f14fec918d4846d7a42de72ff8e171df54463653663d823b5a20fedf007

Request headers

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

Response headers

Content-Type
text/javascript
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 3A92
0
0
Document
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_rendering_2020013001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::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
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/downloads/irfanview/
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/downloads/irfanview/

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, 20 Feb 2020 18:26:45 GMT
expires
Fri, 19 Feb 2021 18:26:45 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
1179
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
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/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:24 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
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:25 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
le.php
media.oadts.com/www/delivery/ Frame BBED
43 B
402 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=12922650285
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:25 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame BBED
43 B
402 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=76043486510
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:25 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame BBED
43 B
402 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=14949485937
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:25 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
avc.php
media.oadts.com/www/delivery/ Frame BBED
11 KB
12 KB
XHR
General
Full URL
https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg1154756052&startmuted=1&cb=0.9404393528498085&loc=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&autostart=1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
e9900cab7526ba4a653a2e6a75ab3d4c9a7011e1a411c2f4136c977369e162a1

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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

Pragma
no-cache
Date
Thu, 20 Feb 2020 18:46:25 GMT
Server
lighttpd/1.4.45
Access-Control-Max-Age
86400
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, max-age=0, no-cache
Access-Control-Allow-Credentials
true
Content-type
application/json
Content-Length
11635
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame BBED
43 B
402 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=58022287582
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:25 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
getAd
video-adserver.ibillboard.com/ Frame BBED
48 B
592 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=3b1bec6b54&ref=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.126 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
bbnaut2.bbelements.com
Software
nginx/1.16.1 /
Resource Hash
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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

Pragma
no-cache
Date
Thu, 20 Feb 2020 18:46:26 GMT
Server
nginx/1.16.1
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
48
Expires
Tue, 01 Jan 1991 00:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame BBED
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.45646417912799486&loc=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2Fhttps%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&dur=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:25 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 7A4C
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstZfiH-_l4UQqXCQjamWH5d7gCYF-hh6mJsz_ON8FiJTj2AvLcbMqkLJgKWU1VZ7ba5gtJFdiNwA_xUnvEOrT7ll3ez5XpgIMy_-ChRYRc&sig=Cg0ArKJSzAAV4DnJeme9EAE&adk=1008420861&tt=-1&bs=1585%2C1200&mtos=1085,1085,1085,1085,1085&tos=1085,0,0,0,0&p=125,429,215,1157&mcvt=1085&rs=0&ht=0&tfs=105&tls=1190&mc=1&lte=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582224384110&dlt&rpt=103&isd=0&msd=0&ext&xdi=0&ps=1585%2C10949&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1189&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%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=20200219
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:25 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
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame E031
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=8699711908
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.75.27 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/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:27 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
C0BFB869C2290853
Content-Length
53
x-amz-id-2
bzO/yU9v+cWVnfUNzLwVZkCsW21ObqmbAciq/FsD5T6AmkWWVvUrglWQyCVrmR/VYmLLk1ER6U8=
Last-Modified
Thu, 20 Feb 2020 14:21:06 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 E031
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=9283611490
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
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/172493?autoplay=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
empty

Response headers

date
Thu, 20 Feb 2020 18:46:26 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
Thu, 20 Feb 2020 19:01:26 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 3227
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=7290942258
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.75.27 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/172495?autoplay=0
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
Thu, 20 Feb 2020 18:46:27 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
98A06A2E9655CFB8
Content-Length
53
x-amz-id-2
MAeL3GUAQOJsV3kLgMK/cGQOshSmlU6B1pf97rcpu0z1AD68JLbgf0TlLyb0gw/781xDbVnQy/Y=
Last-Modified
Thu, 20 Feb 2020 14:21:06 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 3227
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=4198868417
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
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/172495?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

date
Thu, 20 Feb 2020 18:46:26 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
Thu, 20 Feb 2020 19:01:26 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 3227
754 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=8985041440
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.202.68 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-68.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/172495?autoplay=0
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
Thu, 20 Feb 2020 18:46:12 GMT
Via
1.1 c5c25772c7f14e267596e0f8ce51d9bc.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
29
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
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
AnTl87uy50o7xzmD0Zx66b6Wg6w9y8rs1_vbeUeo-fY615b-pNL72g==
Expires
0
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame E031
754 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7197397809
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.202.68 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-68.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:45:56 GMT
Via
1.1 15d3b4db3728feaae1780610a1bac86e.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
89
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
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
OtS23VayHPnrpcZ2INeKi5GhaXjqMer9LUcmx_yObYM8qklxF6NprQ==
Expires
0
/
ssl.2.damoh.giga.de/dad05076c332512ed7e8f3f3a7f9660ec57c494d/ Frame 3227
807 B
2 KB
XHR
General
Full URL
https://ssl.2.damoh.giga.de/dad05076c332512ed7e8f3f3a7f9660ec57c494d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.139.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.139.9.5.clients.your-server.de
Software
AmazonS3 /
Resource Hash
c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed

Request headers

Referer
https://videos.giga.de/embed/172495?autoplay=0
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
Thu, 20 Feb 2020 18:46:27 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
de35-homad-3
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
/
ssl.2.damoh.giga.de/c41703e64fb8d717dede9c007128f0b9ccf0d19b/ Frame E031
807 B
2 KB
XHR
General
Full URL
https://ssl.2.damoh.giga.de/c41703e64fb8d717dede9c007128f0b9ccf0d19b/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.139.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.139.9.5.clients.your-server.de
Software
AmazonS3 /
Resource Hash
c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:27 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
de35-homad-3
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
tag
a.teads.tv/page/68592/ Frame BBED
1 KB
723 B
Script
General
Full URL
https://a.teads.tv/page/68592/tag
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
da1f4955b53f73076c02a1ddb0bb74dd56f6be7bdaa23db334e03cd3d8417634

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:26 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
status
200
cache-control
private, must-revalidate, max-age=3600
access-control-allow-credentials
true
content-length
523
expires
Thu, 20 Feb 2020 19:46:26 GMT
teads-format.min.js
a.teads.tv/media/format/v3/
724 KB
190 KB
Script
General
Full URL
https://a.teads.tv/media/format/v3/teads-format.min.js
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/page/68592/tag
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d9b0ade2de57587310d81f4b319025f2403c0b622a4c957270c3624ef0e1fc35

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:26 GMT
content-encoding
gzip
last-modified
Thu, 20 Feb 2020 16:18:35 GMT
x-amz-request-id
994C5DF12C033240
etag
"b0be4cab30d3b02cb2fc6b179bfa987e"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600
x-bucket
7
accept-ranges
bytes
content-length
194029
x-amz-id-2
1tSIJxVS/6vxq33QNcxSrBYW+H9SYEtRZ5dwPVa+Rn9vCzDfFk9ZZ+FukP8ec3CHuX5X7MOoM4M=
expires
Thu, 20 Feb 2020 18:56:26 GMT
index.html
cmp.teads.mgr.consensu.org/ Frame 168F
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:f3:38c::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-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/downloads/irfanview/
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/downloads/irfanview/

Response headers

x-amz-id-2
mFo+RUeiBSie2v81QaS4uiBM7g519hBNMiw908mHor5+3kpRcSQwWJoZGLGCs2tQ+zoMmsrOI00=
x-amz-request-id
94E67CF8519287C7
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Thu, 20 Feb 2020 18:51:26 GMT
Date
Thu, 20 Feb 2020 18:46:26 GMT
Connection
keep-alive
index.html
cmp.teads.mgr.consensu.org/ Frame 7353
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:f3:38c::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-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/downloads/irfanview/
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/downloads/irfanview/

Response headers

x-amz-id-2
mFo+RUeiBSie2v81QaS4uiBM7g519hBNMiw908mHor5+3kpRcSQwWJoZGLGCs2tQ+zoMmsrOI00=
x-amz-request-id
94E67CF8519287C7
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Thu, 20 Feb 2020 18:51:26 GMT
Date
Thu, 20 Feb 2020 18:46:26 GMT
Connection
keep-alive
p2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=87929085&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.85.250.71 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a104-85-250-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (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
Thu, 20 Feb 2020 18:46:26 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Expires
Mon, 01 Jan 1990 00:00:00 GMT
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Location
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386877&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=87929085&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Pragma
no-cache
Date
Thu, 20 Feb 2020 18:46:26 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1582224386875&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=240&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:28 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Thu, 20 Feb 2020 18:46:28 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1582224386876&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=240&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:28 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Thu, 20 Feb 2020 18:46:28 GMT
p2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=41238701&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.85.250.71 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a104-85-250-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (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
Thu, 20 Feb 2020 18:46:27 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Expires
Mon, 01 Jan 1990 00:00:00 GMT
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Location
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1582224386897&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=41238701&cs_ucfr=1&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Pragma
no-cache
Date
Thu, 20 Feb 2020 18:46:26 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1582224386895&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=240&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:28 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Thu, 20 Feb 2020 18:46:28 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1582224386896&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=multislot&fv=240&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:28 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Thu, 20 Feb 2020 18:46:28 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A596%2C%22height%22%3A335%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&formatVersion=2.22.61&env=js-web&netBw=9.1&ttfb=180
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/downloads/irfanview/
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

pragma
no-cache
date
Thu, 20 Feb 2020 18:46:27 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Thu, 20 Feb 2020 18:46:27 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&formatVersion=2.22.61&env=js-web&netBw=9.1&ttfb=180
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/downloads/irfanview/
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

pragma
no-cache
date
Thu, 20 Feb 2020 18:46:27 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Thu, 20 Feb 2020 18:46:27 GMT
iframe
sync.teads.tv/ Frame 67C1
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=76332&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1582224387023
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
84.53.164.178 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a84-53-164-178.deploy.static.akamaitechnologies.com
Software
akka-http/10.1.5 /
Resource Hash

Request headers

:method
GET
:authority
sync.teads.tv
:scheme
https
:path
/iframe?pid=76332&userId=33ea67f5-e94a-4c6e-ad8b-1c6cc06bd4e2&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1582224387023
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/downloads/irfanview/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
tt_viewer=7c07c250-8175-47dd-8fdc-011a6f55a1f3
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/downloads/irfanview/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
vary
Accept-Encoding
content-encoding
gzip
expires
Thu, 20 Feb 2020 18:46:27 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:27 GMT
content-length
601
set-cookie
tt_bluekai=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_exelate=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_emetriq=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_liveramp=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_neustar=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_salesforce=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_dar=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_skp=; Expires=Fri, 21 Feb 2020 18:46:27 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=adCall&ts=1582224386876&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&gdpr_status=22&gdpr_consent=[gdpr_consent]&gdpr_reason=220&fv=240&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:28 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Thu, 20 Feb 2020 18:46:28 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=noAd-ivt-doubleVerify&ts=1582224386877&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=240&referer=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
pragma
no-cache
date
Thu, 20 Feb 2020 18:46:28 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Thu, 20 Feb 2020 18:46:28 GMT
truncated
/ Frame E031
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627

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
truncated
/ Frame E031
715 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd

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
f91bbd41f24faa32fb62a637da_ciA2NTADMjJmYjQyYTI2NmQ=.jpg
files.giga-video.de/26/22/f0/ Frame E031
19 KB
19 KB
Image
General
Full URL
https://files.giga-video.de/26/22/f0/f91bbd41f24faa32fb62a637da_ciA2NTADMjJmYjQyYTI2NmQ=.jpg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
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
f1ef4c669a56ec39c1623b03d8d2d4c46337bca16051509937ab377c40732c9b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=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
image

Response headers

date
Tue, 28 Jan 2020 07:14:47 GMT
x-content-type-options
nosniff
age
2028700
filer-source
0e909a16c93180b0214ac4f447829fb9c975f5a437c3825fb908f8b0c28039db
x-cache
HIT
status
200
accept-language
bytes
content-length
19045
x-xss-protection
1; mode=block
last-modified
Tue, 28 Jan 2020 07:14:47 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
Thu, 27 Feb 2020 07:14:47 GMT
hic_qos
ssl.1.damoh.giga.de/ Frame 3227
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,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.115.236 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.236.115.76.144.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Referer
https://videos.giga.de/embed/172495?autoplay=0
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
Thu, 20 Feb 2020 18:46:27 GMT
Last-Modified
Wed, 15 May 2019 14:42:46 GMT
Server
openresty/1.15.8.2
ETag
"5cdc2566-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 124C
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8ba4fbc5c2aeec4dedacc299f6ebdcc3dd955d427a28fadda44078c71714630c

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
hic_qos
ssl.1.damoh.giga.de/ Frame E031
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,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.115.236 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.236.115.76.144.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:27 GMT
Last-Modified
Wed, 15 May 2019 14:42:46 GMT
Server
openresty/1.15.8.2
ETag
"5cdc2566-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 07A3
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
76b4dc0a5b3add481baa93e6d069e86238698e53f1b7987e8d5ad896de2c0fb1

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
/
ssl.2.damoh.giga.de/57a2e4b66785ea6246848024c49c5aca5b12085c/ Frame 3227
109 B
671 B
XHR
General
Full URL
https://ssl.2.damoh.giga.de/57a2e4b66785ea6246848024c49c5aca5b12085c/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.139.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.139.9.5.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Referer
https://videos.giga.de/embed/172495?autoplay=0
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
Thu, 20 Feb 2020 18:46:27 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
109
/
ssl.2.damoh.giga.de/478e4ef070ca11d575b184d76d31db675624d20c/ Frame E031
109 B
671 B
XHR
General
Full URL
https://ssl.2.damoh.giga.de/478e4ef070ca11d575b184d76d31db675624d20c/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.139.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.139.9.5.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:27 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
data
lb75.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb75.s400.meetrics.net/data?/bJUDE+IBA/k0FeImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzxA4zBxmAhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B1zAwzA1xAw2AwzAmjEpkF9xAz4AzwAz3A4yA51A2mAzpF6lF9zAx4EzxAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AzwAz1AxwA2wAzmAhwFk9B1zAwzA1xAw2AwzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A0zAx4ALlnFCUkzF2BPyCAAAAAAABo8hAPAAAFAAo8hTl5/APAAAtGA9BABl5/AZBAAOA55A55A85B55A58E55A55AGAxzA5wA04Arl5/AP6BAtGA9BAHl5/APAAAYLAaBAMl5/ASksFbFjAAAAAAAAAAAAEAAAo8hAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAzxA4zBxBEMAxzA4zAwzA34Ay5A12AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwzA1xAw2AwzAGAihFuuFlyFKA1zAwzA1xAw2AwzAKA1zAwzA1xAw2AwzA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGiFhuFulFyBFdtGA9BAfAAfAAFAAAl5/AAAAAPA4tB1uFruFv3FutBzxA4zBxBEAAAAAAAAAAAAAAAAQtjFMXlcWA
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:27 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 20-Feb-20 18:46:26 GMT
data
lb75.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb75.s400.meetrics.net/data?/bJUDF/IBA/k0FOMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzxA4zBxmAhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B1zAwzA1xAw2AwzAmjEpkF9xAz4AzwAz3A4yA51A2mAzpF6lF9zAx4EzxAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AzwAz1AxwA2wAzmAhwFk9B1zAwzA1xAw2AwzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A0zAx4AmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGzFr5FmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A34A2zALlnFDTkzFePe1AAAAAAABiqqAPAAAFAAiqqT7OtASksFXGjAAAAAAAAAAAAEAAAiqqAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAx2Aw4E2wAwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFDAzrF5BFEAu1FssFEAu1FssFyAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGzFr5FdmUA9BAgCAYJAFAAA7OtAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAz3AvoE0tFsvBjvFu0FhpFulFyuBo0FtsFOATrF5zFjyFhwFlyFfxB2wAAAAAAAAAAAAAAAAAQtjFss+IZA
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:27 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 20-Feb-20 18:46:26 GMT
data
lb75.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb75.s400.meetrics.net/data?/bJUDGJOBAUkzFJBPAAAmUA9BAB7OtAZBAAOA55A55A85B55A58E55A55AGAx3A03A10Ar7OtAPMEAmUA9BAH7OtARksFAQtjFQETOSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:28 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 20-Feb-20 18:46:27 GMT
94c6b45b-e717-45f9-8715-ef73f3e1040d
https://videos.giga.de/ Frame E031
5 KB
0
Other
General
Full URL
blob:https://videos.giga.de/94c6b45b-e717-45f9-8715-ef73f3e1040d
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
db8bcd3688917cc569268e2fb6f4a4d93808e9e6915555d4099601434efc00c8

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
5409
Content-Type
application/javascript
playlist.m3u8
lx56.spieletips.de/172493/ Frame E031
306 B
848 B
XHR
General
Full URL
https://lx56.spieletips.de/172493/playlist.m3u8
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
0a94e4bf1aaab82ffcf4564c53f210ad7fb8fc63e59a992d1921a8b06800e270

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:28 GMT
Last-Modified
Wed, 16 Sep 2015 09:17:11 GMT
Server
nginx/1.4.7
ETag
"55f93397-132"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
306
Expires
Thu, 31 Dec 2037 23:55:55 GMT
muted.png
videos.giga.de/image/plugins/automute/ Frame E031
1 KB
1 KB
Image
General
Full URL
https://videos.giga.de/image/plugins/automute/muted.png
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
6539647c8b30c6775cb9f64c29f58be4853888f15ba57d080df76be46c1ae0dd

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=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
image

Response headers

date
Thu, 20 Feb 2020 18:46:28 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-4b9"
content-type
image/png
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1209
expires
Wed, 20 May 2020 18:46:28 GMT
720p.m3u8
lx56.spieletips.de/172493/ Frame E031
715 B
1 KB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p.m3u8
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
3cf51e4e895f4b00bfcbc9f57901ccc3481bf5d23d8c69cdc06fe55c22e3e3c5

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:28 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:41 GMT
Server
nginx/1.4.7
ETag
"55f93469-2cb"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
715
Expires
Thu, 31 Dec 2037 23:55:55 GMT
27b4bba6-4371-4e1f-92f0-95c4c53ceb49
https://videos.giga.de/ Frame E031
63 KB
0
Other
General
Full URL
blob:https://videos.giga.de/27b4bba6-4371-4e1f-92f0-95c4c53ceb49
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
ce849b7260337e8b930e839d90732c26492c49ea8a39763439d600583b3fd070

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
64777
Content-Type
application/javascript
data
lb75.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb75.s400.meetrics.net/data?/bJUDHzdBA/k0FLQmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEv1F0fFvmFfwFhnFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA4zA5yA2mEvyFthF0jFvkFl9B4tB1uFruFv3FutBzxA4zBxmAhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B1zAwzA1xAw2AwzAmjEpkF9xAz4AzwAz3A4yA51A2mAzpF6lF9zAx4EzxAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AzwAz1AxwA2wAzmAhwFk9B1zAwzA1xAw2AwzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A0zAx4AmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFwyFvkF1rF0zFlpF0lFlyAGzFr5FmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA14AyyAy0Az4A34A2zAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfwFyvFk1Fr0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAyyA0zA45Ax5A1BELlnFETkzFARksFAQtjFgKIxYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:29 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 20-Feb-20 18:46:28 GMT
thumbs.vtt
videos.giga.de/thumbs/172493/ Frame E031
4 KB
4 KB
XHR
General
Full URL
https://videos.giga.de/thumbs/172493/thumbs.vtt?server=lx56
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
a918d25f52d75a199fe1f36b7e9472fea96cc776173edce7e90e95b760a6f430

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=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
empty

Response headers

status
200
date
Thu, 20 Feb 2020 18:46:29 GMT
server
nginx/1.14.1
x-robots-tag
noindex
content-type
text/vtt;charset=UTF-8
bridge3.368.0_en.html
imasdk.googleapis.com/js/core/ Frame 8E56
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.368.0_en.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::200a 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
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.368.0_en.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://videos.giga.de/embed/172493?autoplay=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
iframe
Referer
https://videos.giga.de/embed/172493?autoplay=1

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
195961
date
Fri, 14 Feb 2020 22:00:44 GMT
expires
Sat, 13 Feb 2021 22:00:44 GMT
last-modified
Fri, 14 Feb 2020 20:54:12 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
506745
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
client.js
s0.2mdn.net/instream/video/ Frame E031
26 KB
10 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=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
script

Response headers

date
Thu, 20 Feb 2020 18:46:29 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
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
10523
x-xss-protection
0
expires
Thu, 20 Feb 2020 18:46:29 GMT
integrator.js
adservice.google.com/adsid/ Frame E031
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=videos.giga.de
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::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://videos.giga.de/embed/172493?autoplay=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
script

Response headers

date
Thu, 20 Feb 2020 18:46:29 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
720p00000.ts
lx56.spieletips.de/172493/ Frame E031
2 MB
2 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00000.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
83d917ca4e1780fdada9c3cacd6fbc6966a510cfbb407dd65973869a5ff95cb7

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:29 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:42 GMT
Server
nginx/1.4.7
ETag
"55f9346a-266b7c"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
2517884
Expires
Thu, 31 Dec 2037 23:55:55 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=1582224393000&__it=-60&__ic=727391&__iq=ce622a7cc3514b522a3d6b39652425fb&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:33 GMT
Last-Modified
Fri, 12 Feb 2010 18:46:24 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
Thu, 14 Feb 2013 18:46:24 GMT
cc
adserver.schneevonmorgen.com/adserve/v1/ Frame E031
Redirect Chain
  • https://adserver.schneevonmorgen.com/adserve/v1/cc
  • https://adserver.schneevonmorgen.com/adserve/v1/cc?sbs=true
0
-1 B
XHR
General
Full URL
https://adserver.schneevonmorgen.com/adserve/v1/cc?sbs=true
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.151.158 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.158.151.251.148.clients.your-server.de
Software
openresty/1.15.8.1 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=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

Response headers

date
Thu, 20 Feb 2020 18:46:33 GMT
server
openresty/1.15.8.1
access-control-allow-origin
https://videos.giga.de
location
/adserve/v1/cc?sbs=true
access-control-allow-methods
GET, OPTIONS
content-type
application/json; charset=UTF-8
status
302
access-control-allow-credentials
true
strict-transport-security
max-age=15724800; includeSubDomains
access-control-allow-headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
content-length
12

Redirect headers

date
Thu, 20 Feb 2020 18:46:33 GMT
server
openresty/1.15.8.1
status
302
location
/adserve/v1/cc?sbs=true
access-control-allow-methods
GET, OPTIONS
content-type
application/json; charset=UTF-8
access-control-allow-origin
https://videos.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15724800; includeSubDomains
access-control-allow-headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
content-length
12
cc
adserver.schneevonmorgen.com/adserve/v1/ Frame E031
12 B
401 B
XHR
General
Full URL
https://adserver.schneevonmorgen.com/adserve/v1/cc?sbs=true
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.151.158 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.158.151.251.148.clients.your-server.de
Software
openresty/1.15.8.1 /
Resource Hash
3c6434ebf1fa8ad27a9f9b3d6b7d5cdd53338a11fdcd50d943872c680a5e9f3d
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:33 GMT
server
openresty/1.15.8.1
status
200
etag
"ff8d92dfe330184771556be84b5cae542c875729"
strict-transport-security
max-age=15724800; includeSubDomains
access-control-allow-methods
GET, OPTIONS
content-type
application/json; charset=UTF-8
access-control-allow-origin
https://videos.giga.de
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,Authorization
content-length
12
collect
www.google-analytics.com/r/
35 B
111 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=AdError&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=108954033&gjid=867366436&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&_r=1&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&z=1413076863
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:33 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
/
ssl.2.damoh.giga.de/0c0011adbafcf340681980962eeb41a5175ae16d/ Frame E031
750 B
1 KB
XHR
General
Full URL
https://ssl.2.damoh.giga.de/0c0011adbafcf340681980962eeb41a5175ae16d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBhaXBhZUdob2hjaGVpVm89cGFpcGFlR2hvaGNoZWlWb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucmZ8fCh3LnJmPTApO3cucmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5yZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBmPTA7ZjxELmxlbmd0aDtmKyspRFtmXS5sb2FkKCk7CmZvcihmPTA7ZjxELmxlbmd0aDtmKyspe3ZhciBhPURbZl0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGY9d2luZG93Lk9PO2Z8fChmPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk1lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnJuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmKGQ9ZCgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZCxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZD1tLnN0YXJ0UGxheWVyO2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgZCYmZCgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuRmYoYyk7Yi5WbihsKTtiLlVuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuQWIubGVuZ3RoKXt2YXIgYj1sLkFiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGQ7ZD1mLmJvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2RbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2RbIltVVElMU10iXV09bDtmb3Iod2luZG93W2RbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBkIGluIGIpbVtkXT1iW2RdO3QoYyxhKX07ZD1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChkLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuWmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlppfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuem4uYmluZCh0aGlzKSk7dGhpcy52Yj17fTt0aGlzLnFoPXt9O3RoaXMuQ2Y9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt0bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy52Yil0aGlzLnZiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy52YlthXSsiXyIpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3RoaXMuQ2Z8fCh0aGlzLkNmPWYuVigxMCkpO3JldHVybiB0aGlzLkNmfSx3YjpmdW5jdGlvbihiKXt0aGlzLnZiW2JdfHwodGhpcy52YltiXT0wKTt0aGlzLnZiW2JdKz0xOzU8dGhpcy52YltiXSYmIXRoaXMucWhbYl0mJih0aGlzLnFoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudG8oKSwhMCkpfSxEZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFNrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChlKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LG1hOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZX0pfSx6bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy55bihiLmRhdGEpfSx5bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZT0wO2U8YTtlKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZV0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2VdLmNiKGIpfSx4ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE9nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmZoKGIpLGU9ITE7aWYoYSlyZXR1cm4gdGhpcy5TYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGV9LGZoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFFrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGYuUGwoYikpcmV0dXJuOyhhPXRoaXMuT2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LFBsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxZZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUmU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxlPSIiO2ZvcihlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmCmErKztyZXR1cm4gYX0sZWg6ZnVuY3Rpb24oYixhKXt2YXIgZT1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUoKSk6Im9iamVjdCI9PT10eXBlb2YgZT9lOm51bGx9LGVvOmZ1bmN0aW9uKGIsYSxlKXtiJiYoYi5zdHlsZVthXT1lKX0sSGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGU9dGhpcy5BbChhKSxnPTA7ZzxlLmxlbmd0aDtnKyspdGhpcy5lbyhiLGVbZ10ua2V5LGVbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGU9e30sZz1lPSIiLG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIGY9YltuXS5zcGxpdCgiOiIpLAplPWZbMF0udHJpbSgpO2ZbMV0mJmZbMV0udHJpbT9nPWZbMV0udHJpbSgpOmc9IiI7ZS5pbmRleE9mJiYwPD1lLmluZGV4T2YoIi0iKSYmKGY9ZS5zcGxpdCgiLSIpLGU9ZlswXSt0aGlzLmdsKGZbMV0pKTtlPXtrZXk6ZSx2YWx1ZTpnfTthLnB1c2goZSl9cmV0dXJuIGF9LE9mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHpoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LCRlOmZ1bmN0aW9uKGIsYSl7dmFyIGU9MCxnPTAsbj0wLGY9MCxjPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtuPWguaGVpZ2h0Kmgud2lkdGg7ZT1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGUrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihlLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5lJiYoZT0wKTswPG4mJihmPTEwMC9uKmUqZyk7Zj49YSYmKGM9ITApO3JldHVybiBjfSxhZjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLiRlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFmKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFNiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGU9MDtlPGI7ZSsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxUZTpmdW5jdGlvbihiKXt2YXIgYT0wLGUsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZD0iIixlLGc7Zm9yKGU9NzswPD1lO2UtLSlnPWI+Pj40KmUmMTUsZCs9Zy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZShiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLG4sZj1BcnJheSg4MCksYz0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7cD1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8cC0zO2crPTQpbj1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQocC0yKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChwLTMpPDwyNHxiLmNoYXJDb2RlQXQocC0yKTw8MTZ8Yi5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKHA+Pj4yOSk7ci5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1lKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO249YztwPWg7bT16O3k9azt0PWw7Zm9yKGc9MDsxOT49ZztnKyspcT1lKG4sNSkrKHAmbXx+cCZ5KSt0K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZShuLDUpKyhwXm1eeSkrdCtmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1tLG09ZShwLDMwKSxwPW4sbj1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWUobiw1KSsocCZtfHAmeXxtJnkpK3QrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWUocCwzMCkscD1uLG49cTtmb3IoZz02MDs3OT49ZztnKyspcT1lKG4sNSkrKHBebV55KSt0K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1lKHAsMzApLHA9bixuPXE7Yz1jK24mNDI5NDk2NzI5NTtoPWgrcCY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bD1sK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShjKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZSxnLG4sZixjLGgsej0wO3o8Yi5sZW5ndGg7KWU9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxuPWIuY2hhckNvZGVBdCh6KyspLGY9ZT4+MixlPShlJjMpPDw0fGc+PjQsYz0oZyYxNSk8PDJ8bj4+NixoPW4mNjMsaXNOYU4oZyk/Yz1oPTY0OmlzTmFOKG4pJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxCZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZT0hMSxnPSExLG49ITEsZj0hMSxjPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGU9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZmM/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksZj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWU7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWY7Yi5pc1NhZmFyaT1jO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17T2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVmk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sd206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sVWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sems6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sams6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSwkazpmdW5jdGlvbigpe3JldHVybiBiLk9pKCl8fApiLlZpKCl8fGIud20oKXx8Yi5VaigpfHxiLnprKCl8fGIuSGooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuJGsoKX0sVmw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxlLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZT0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZVsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGU9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWUpKXJldHVybiBlLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGU9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGVbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2FbZ11dPWJbZ118fCIiO2UucXVlcnlLZXk9e307ZVthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGQpe2EmJihlLnF1ZXJ5S2V5W2FdPQpkKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LEthOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGU9ITApO3JldHVybiBlfSxpbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZT0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LGxvOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSxlPTM2MDAqK2VbMF0rNjAqK2VbMV0rICtlWzJdLGU9TWF0aC5yb3VuZChlKSl9Y2F0Y2gobil7ZT0tMX1yZXR1cm4gaXNOYU4oZSk/LTE6ZX0sJGc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTWU6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5OYjt0aGlzLnVlKGUpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZX0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZSkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChuKXt0aGlzLnJuPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEtjOmZ1bmN0aW9uKGIsYSxlKXthfHwoYT0iaGRFdmVudCIpO2V8fChlPXdpbmRvdyk7dGhpcy5NZShlLGEsYil9LG86ZnVuY3Rpb24oYixhLGUsZyxuLGMsaCl7dmFyIHg9YjtlJiZhJiYoYT1rLlRhKGEsZSkpO2EmJih4PWsuVGEoYixhKSk7ZyYmKHg9ay5UYSh4LGcpKTtuJiYoeD1rLlRhKHgsbikpO2MmJih4PWsuVGEoeCxjKSk7aCYmKHg9ay5UYSh4LGMpKTtmLktjKHgpfSxBbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGUpe31yZXR1cm4gYX0sbW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudWUoYil9LHVlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQW4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZSl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLndhKGIsITApO2I9bC53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkxhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxlKXtpZihlKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGUpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC53YShnLCEwKTtnPWwud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5MYShnLGZ1bmN0aW9uKGUpe3ZhciBnPSExO2U9ZS5yZXNwb25zZVRleHQ7dHJ5e2U9SlNPTi5wYXJzZShlKSxlPWUuZGF0YSxlWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxlWzFdJiZlWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goZil7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChlWzBdP2VbMF06IiIpKyhlWzFdP2VbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxlPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGU9bC53YShlLCEwKTtlLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkxhKGUpfX0samY6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSw1MDApfSxQZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMudWIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxTZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5TZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGIsYSxlLGcpe2U9ITE7aWYoYS5iZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkFmJiZ3aW5kb3cuc2FuZGJveC5BZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LkFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgbj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtuLmhvbWFkX3VybF9zdWZmaXg9YjtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2UmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPSExO2U9ITE7ZT10aGlzLmViKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2Y9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Znx8KGY9ZSksZj1KU09OLnBhcnNlKGYpfWNhdGNoKGMpe2Y9CiExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGUsZyxmLGMsaCx4KXt2YXIgaz1jfHxsO2M9ITA7eCYmKGM9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2YobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWYoKTtlbHNle2sud2EoYixjKTtjPWsud2EoYixjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBlKWMuZGF0YVt0XT1lW3RdO3JldHVybiBrLkxhKGMsZyxmLCIiLCIiLGgpfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYihiLGEsZSxnLGYsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFNjOmZ1bmN0aW9uKGIsYSxlLGcsZixjLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXtoPWU7ZT0iIjtmb3IodmFyIGsgaW4gaCllKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2U9ZS5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtmJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmYobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWMsMDxlLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZSl9Y2F0Y2gobSl7ZiYmZigpfXJldHVybiBsfSxTbTpmdW5jdGlvbihiLGEsZSl7dGhpcy5TYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucmIoYik7ZSYmKGMub25lcnJvcj1lKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGUpfSxFaDpmdW5jdGlvbihiLGEsZSxnKXt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YjtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYik7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5lYihiLGcuQWEsZixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goZil7Yj0hMX10aGlzLlNtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGJvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxlLGcsZil7dGhpcy5lYihiLGUse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBlPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2VbMF0mJihlPWVbMF0pO2U/ZS5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGUuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixlLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixlLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGUuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixlLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixlLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmUucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixlLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZS5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGUuZGlkKSxmKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Zih7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmYoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChjKXtmKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Yoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSxhbDpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZT1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5lP2E9ITA6KGU9Yi5zdWJzdHJpbmcoZSs3LGIuaW5kZXhPZigiKSIsZSkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitlKyIpIixlbmNvZGVVUklDb21wb25lbnQoZSkpKX1yZXR1cm4gYn0sRG06ZnVuY3Rpb24oYixhKXt2YXIgZT0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtlPSEwO2JyZWFrfXJldHVybiBlfSxpYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1mLnBqPWE7YS5UYT1mdW5jdGlvbihiLGEpe3ZhciBlPXt9LGc7Zm9yKGcgaW4gYSllW2ddPWFbZ107Zm9yKGcgaW4gYillW2ddPWJbZ107cmV0dXJuIGV9O2EudG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZm49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5IbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnNwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EucGc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Xbz17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmVuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5LZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS53ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkhjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucmU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5CaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmpuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLktkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlVmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5MZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Sbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5nbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkRrfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnJqPWE7YS5wcm90b3R5cGU9e1RlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZSxnLGY7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGU9Yi5sZW5ndGgtMSxhPSIiOzA8PWU7YSs9YltlLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5UZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZT0wO2U8Yi5sZW5ndGg7ZSsrKWErPXRoaXMuRWQoYltlXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuVGUodGhpcy5lbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLAplPTA7ZTxiLmxlbmd0aDtlKyspYSs9dGhpcy5FZChiW2VdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuQWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihkKXt2YXIgZT10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZSksZjtmb3IoZiBpbiBkKWdbZl09ImZ1bmN0aW9uIj09PXR5cGVvZiBkW2ZdJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtmXSYmYi50ZXN0KGRbZl0pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXMuajt0aGlzLmo9ZVtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZDtyZXR1cm4gZ319KGYsZFtmXSk6ZFtmXTtkPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtlLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZC5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWQ7ZC5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGR9O2YuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmxuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5sbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy4kaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLk1hPQp7fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuV24oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0semY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxXbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTWFbYS5rYSgpXT1hO0wmJkwuRGgmJkwuc28oYSl9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIGYuUmUodGhpcy5NYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZDtmb3IoZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlVhKCk7Zm9yKHZhciBiIGluIHRoaXMuTWEpaWYoYS5pZD09dGhpcy5NYVtiXS5VYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLk1hW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLiRqfHxxOyhmdW5jdGlvbihjKXtjLmJrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLlVhKCksCmU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30saG86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sWW46ZnVuY3Rpb24oYSl7dGhpcy5tZj1hfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1mfSxsZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5zbSgpfHx0aGlzLk1rKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApjcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxmZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxmcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ia3x8cjsoZnVuY3Rpb24oYyl7Yy5LaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuRmYoYSk7dGhpcy5YbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxmLmpmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZD1uZXcgSTt3aW5kb3dbZC5nYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2QuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuR2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBkPSEwO2EmJihkPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkdmKCk7cmV0dXJufXRoaXMuR2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxkKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBkPTA7ZDx0aGlzLm9iLmxlbmd0aDtkKyspdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2RdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2RdLmRldGFpbCksYT10aGlzLm9iW2RdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihkPWYudW5pcXVlKGIpLGE9YSsiLSIrZC5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxHZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGNvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxGZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxXbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuS2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLnBuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5wbnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuZmo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZmp8fG9hOyhmdW5jdGlvbihmKXtmLmdqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5OcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oZil7Zi5oaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuaGp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuUG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLlBvfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Daj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMueGI9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTGUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMueGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnhiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5MZSgpO2lmKHRoaXMueGIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxMZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMueGI9ITApO3RoaXMuVyhiKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm1mJiYoMCx0aGlzLm1mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE9lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Danx8c2E7KGZ1bmN0aW9uKGMpe2MuQmo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnFlPSExO3RoaXMuc2U9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGQ9MDtkPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2QrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2RdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGU9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGQ9MDtkPAplLmxlbmd0aDtkKyspYS5vbihlW2RdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWVbZF0mJih0aGlzLnFlPSEwKTsiYWRJbXByZXNzaW9uIj09PWVbZF0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy4kbSYmIXRoaXMuemEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTWQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMuc2UmJnRoaXMuaSgpKX0sV206ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5LZT90aGlzLktlKys6dGhpcy5LZT0xOnRoaXMuSmU/CnRoaXMuSmUrKzp0aGlzLkplPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLk9mKGIudmlkZW9UYWcpP2IueGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5xZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSmU+dGhpcy5LZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5MZSgpLGIueGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5abCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZCYmZCgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpkLnhifHx0aGlzLk0oZCl8fHRoaXMuRW0oZCl8fCh0aGlzLk4oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5QKCl9fSxZcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucmIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYuSWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLklqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oZil7Zi50az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWmQoYSl9LmJpbmQodGhpcykpfSxaZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGQpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnRrfHx4YTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuUWM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy5WZj0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5kbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy56YigpKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5vZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS55ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcueWU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy55ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApPYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk5jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5RYyl7dmFyIGE9dGhpcy5OYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlFjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5RYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlFjfSxDbTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk5jKCksYj10aGlzLkFtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk9jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMuSW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKX0sSW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLkRhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5IKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLkgoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuSCgiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxYcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTmcmJmEuYWRzJiYodGhpcy5OZz1hLmFkcyk7cmV0dXJuIHRoaXMuTmd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5OYygpLGQ9dGhpcy5PYygpO2ImJmQmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk5jKCksYT10aGlzLk9jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilkPSEwO2R8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp5YjpmdW5jdGlvbigpe3JldHVybiBmLkhlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy50bSgpKXt0aGlzLnZhPSEwO2lmKGYuSCgiZ2lnYS5kZSIpfHxmLkgoInNwaWVsZXRpcHBzLmRlIil8fGYuSCgia2luby5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSl0aGlzLlZmPSExLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sdG06ZnVuY3Rpb24oKXtpZigwPD1mLkthKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZi5IKCJnaWdhLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtmLlNjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFmLmliKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWYuVmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBmLkhlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlZmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlZmLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuZ3F8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5za3x8eWE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2RdKX1jYXRjaChlKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuUmUoYikpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihhPW5ldyB4YShiW2RdKSxhLmhhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRikpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKX19KX0pKGMpO3ZhciB6YT1jLnVrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe31mLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy5kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGYpe2YuV2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5zZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5VKCl9LHZuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTWIsZD10aGlzLmthKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZiJiZiLm9jJiYoMDw9ZC5pbmRleE9mKGUpfHxiLk1kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5zZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMuc2YrKztpZigxMDx0aGlzLnNmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxOYTpmdW5jdGlvbigpe30sClpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgUj1jLldqfHxSOyhmdW5jdGlvbihmKXtmLlZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmUpaWYodGhpcy5PYnx8KHRoaXMuT2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5OZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIpO3RoaXMueWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBkPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWQ9ITA7ZHx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGR9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYihkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5LbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS52bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVmp8fENhOyhmdW5jdGlvbihmKXtmLlhqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgUihhW2JdKTtkLmhhfHx0aGlzLk0oZCl8fCh0aGlzLk4oZCksCihuZXcgQ2EoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuWGp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihmKXtmdW5jdGlvbiBhKCl7fWYubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLm5rfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9Zi5laChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLnhuPWEucG9zaXRpb25pbmc7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS53aWR0aD1hLndpZHRoO2Quc3R5bGUubWluV2lkdGg9CmEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMueG4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGQpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkLGIpfXRoaXMuVChkKTt0aGlzLlcoZCk7dGhpcy5DZD1kfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLnpoKHRoaXMuQ2QpOwpmLiRlKHRoaXMuQ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxmZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMueGp8fEdhOyhmdW5jdGlvbihmKXtmLndqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLndqfHxJYTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9Zi5laChhLCJlbGVtZW50SUQiKTtpZihmLnpoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy55anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoKXt9Zi51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMudW58fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Zi5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE5rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxlLGcsYyl7dGhpcy5GYT1iO3RoaXMuWmc9dGhpcy5FaT0hMTt0aGlzLkxoPWU7dGhpcy5paT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2UmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9lKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuY2YodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixlO2ZvcihlIGluIGEpYis9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2VdKTtiPWIuc3Vic3RyKDEpfXRoaXMuWmcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMubGIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmlpP3RoaXMubGIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkVpfHwodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmxiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbCYmbC5jZih0aGlzLkZhLnVybCkmJiFiP2YudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTpsLmNmKHRoaXMuRmEudXJsKSx0aGlzLkxoJiZ0aGlzLkxoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5sZT0hMX1mLmJqPWE7YS5wcm90b3R5cGU9e2FvOmZ1bmN0aW9uKGIpe3RoaXMubGU9Yn0sJG46ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxNbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt3cDoiQWRDbGlja1RocnUiLHlwOiJBZEVycm9yIix6cDoiQWRTdG9wcGVkIiwKQ3A6IkFkTGluZWFyQ2hhbmdlIixEcDoiQWRUYWdQYXJzZWQiLEdwOiJBZFZpZGVvQ29tcGxldGUiLEpwOiJBZExvYWRlZCIsS3A6IkFkU2tpcHBlZCIsTHA6IkFkU3RhcnRlZCIsQXA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixCcDoiQWRJbXByZXNzaW9uIix4cDoiQWRDcmVhdGl2ZVZpZXciLEVwOiJBZFZpZGVvTWlkcG9pbnQiLEZwOiJBZFBhdXNlZCIsSHA6IkFkVmlkZW9TdGFydCIsSXA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIodGhpcy5sZSxhW2VdKX0sTG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmtlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmtlKXRoaXMuR2Eua2UuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5rZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMubGUmJnRoaXMuTW4oKTt0aGlzLkdhJiZ0aGlzLkxuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5xYj0iIjt0aGlzLnFkPXRoaXMuZWM9dGhpcy5wYj1udWxsO3RoaXMuVGc9dGhpcy5BYj10aGlzLmVmPSExO3RoaXMuQWE9IiI7dGhpcy5kZj0hMTt0aGlzLnFhPXRoaXMuUGM9IiI7dGhpcy5aZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy54Zj0hMTt0aGlzLmlhPVtdO3RoaXMuVmU9dGhpcy5WYj0iIjt0aGlzLmllPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5uYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5hYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5XYj0iIjt0aGlzLlhiPVtdO3RoaXMuWWI9W107dGhpcy5iZD1bXTt0aGlzLnRjPSIiO3RoaXMuSGI9ITE7dGhpcy5ZZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm5jPSExO3RoaXMuSWc9dGhpcy5jZT1udWxsO3RoaXMuS2Y9dGhpcy5qYj10aGlzLlNnPXRoaXMuYWU9dGhpcy5XZj10aGlzLnNkPXRoaXMueGM9ITE7dGhpcy5hYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucGg9ITE7dGhpcy5vaD0xRTM7dGhpcy5FYz0hMTt0aGlzLlFhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuRmk9ITE7dGhpcy5ZYz10aGlzLlBkPW51bGx9Yy51aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5xYixhZHRhZ21vZGlmaWVyOnRoaXMucGIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmVjLGFkdGFncmVnZXg6dGhpcy5xZCxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5lZixzaWRlbG9hZHM6dGhpcy5BYixkaXNhYmxldGVzdHM6dGhpcy5UZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLmRmLGdsb2JhbENvbmZpZzp0aGlzLlBjLGNsaWVudENvbmZpZzp0aGlzLnFhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5aZSxzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLlZlLEhPTUFEX1ZFUklGSUVEOnRoaXMuaWUsSE9NQURfQkxPQ0tFRDp0aGlzLmhlLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsCnRlc3RUYWdzWEhSOnRoaXMuYmQsdGVzdDNQQ29va2llOnRoaXMudGMsdGhyb3R0bGU6dGhpcy5ZZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLm5jLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuSWcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy54YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuc2QsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuV2YsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuYWUsY29uZmlnRmFpbHVyZXM6dGhpcy5hYixzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5CZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuYmIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLktmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFRuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQWN0aXZlJiYodGhpcy5DYT1iLmlzQWN0aXZlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy5xYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLnBiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuZWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5xZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmVmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy5BYj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJgoodGhpcy5BYT1iLmhvbWFkQWxpYXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuZGY9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuUGM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5xYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlplPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaG9tYWRBZHBhdGgmJih0aGlzLlZlPWIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLmllPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuaGU9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMubmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5hYz1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJgoodGhpcy5iZD1iLnRlc3RUYWdzWEhSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMudGM9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLllkPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLm5jPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLklnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi51c2VTdHJpY3RDaGVja3MmJih0aGlzLldmPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuYWU9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLmFiPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5CZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmJiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuS2Y9Yi5za2lwQWxsb3dlZCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIudm1hcHMmJih0aGlzLmFnPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuRWM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmxkPWIuYWRGYWxsYmFja1VSTCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIueWllbGRsYWImJih0aGlzLkRiPWIueWllbGRsYWIpfSxybTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5hYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LERmOmZ1bmN0aW9uKGIpe3RoaXMuYWJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmFiW2FdJiYxPT10aGlzLmFiW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFdkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuYWwoYil9LHdhOmZ1bmN0aW9uKGIsYSxlKXt2YXIgZz0iIixmPSIiLGM9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5iZihiKTsKZj10aGlzLmFhKGIpO2c/KHRoaXMuUmMoKT9jPWI6Yz1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixoPWYucGF0aC5zdWJzdHIoMSkpOihjPXRoaXMucWMoKSxoPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtlJiYodGhpcy5xYnx8dGhpcy5wYnx8dGhpcy5lY3x8dGhpcy5xZCkmJihoPXRoaXMuYm4oaCkpO2I9bmV3IEMoYyk7Yi51cmw9YztjPSIiO2M9Zz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ibShmLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpOyhlPWUuZXhlYyhiKSkmJihlWzJdfHxlWzVdKT9hPSEwOnRoaXMuUmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhiKSkmJmVbNF0mJihhPSEwKSk7cmV0dXJuIGF9LFJjOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0iIjt0aGlzLmlhJiZ0aGlzLmlhLmxlbmd0aCYmMDx0aGlzLmlhLmxlbmd0aCYmKGE9dGhpcy5pYVswXSxhPWEucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxjZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxlPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZSYmKGVbMl18fGVbNV0pP2E9ITA6YT10aGlzLmJmKGIpO3JldHVybiBhfSwKYm06ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkFhJiYwPHRoaXMuQWEubGVuZ3RoKXJldHVybiB0aGlzLkFhO2ZvcihlIGluIHRoaXMuQWEpaWYoYT10aGlzLkFhW2VdLGEuaGFzT3duUHJvcGVydHkoInVybCIpJiZhLnVybD09PWIpcmV0dXJuIGEuU3A7cmV0dXJuIm5vbmUifSxJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhW3RoaXMuQmZdfSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWQoKSxhPXRoaXMuSWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGU9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKX0sSGg6ZnVuY3Rpb24oYixhLGUpe2I9ITE7YT0iIjtpZihlLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZS5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1lLmZhbGxiYWNrJiYKKGE9ZS5mYWxsYmFjayk7cmV0dXJuIGF9LGFuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9Zi5hYShiKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBhKXtpZihhW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sQj0wO0I8aC5sZW5ndGg7QisrKXt2YXIgaz1oW0JdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBhW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMuSGgoZ1tsXSxsLGFbY10uc3VidmFsdWVzW2xdKTtoPVtdO2ZvcihsIGluIGcpaC5wdXNoKGwrIj0iK2dbbF0pO2c9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZz10aGlzLkhoKGUucXVlcnlLZXlbY10sYyxhW2NdKTtlLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBlLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitlLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1lLmhvc3QrZS5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmCihiKz10aGlzLnFiKTtpZih0aGlzLnBiKWZvcih2YXIgYSBpbiB0aGlzLnBiKXRoaXMucGIuaGFzT3duUHJvcGVydHkoYSkmJihiPWIucmVwbGFjZShhLHRoaXMucGJbYV0pKTt0aGlzLmVjJiYoYj10aGlzLmFuKGIsdGhpcy5lYykpO3JldHVybiBifSxwbDpmdW5jdGlvbigpe3RoaXMueWEmJnRoaXMueWEuY2xpZW50QVBJcyYmdGhpcy5qbCh0aGlzLnlhLmNsaWVudEFQSXMpfSxqbDpmdW5jdGlvbihiKXtpZihiKXt2YXIgYT1uZXcgTmE7Yi5wdWJsaXNoZXJBUEkmJmEuYW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLiRuKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGUsZyxmLGMpe2w9dGhpczt0aGlzLmRmPSEwO3RoaXMuUGM9Yjt0aGlzLnFhPWE7dGhpcy54Zj1lO3RoaXMuY2U9Zzt0aGlzLmljPWY7dGhpcy55YT1jfHx7fTt0aGlzLnBsKCk7dGhpcy5SbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlBtKCk7ZWxzZSBpZigib2JqZWN0IiE9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hKCksdGhpcy5HYygpfWNhdGNoKGgpe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSx0aGlzLkdjKCl9Y2F0Y2goayl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX19LGZiOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dHJ5e2E9bmV3IEV2ZW50KGIpfWNhdGNoKGUpe2E9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYS5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBhfSxDbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkxhKG5ldyBDKHRoaXMuUGMrdGhpcy53ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImdsb2JhbCIpOyJvYmplY3QiPT0KdHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuR2MoKX0uYmluZCh0aGlzKSwhMCl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5MYShuZXcgQyh0aGlzLnFhK3RoaXMud2UoImNsaWVudCIsLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5HYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sd2U6ZnVuY3Rpb24oYixhKXt2YXIgZTtlPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlNiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihlPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihlPSIiKTtyZXR1cm4gZX0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksCmE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChkKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPQp3aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTsiZm9jdXMuZGUiPT1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0hMSk7dGhpcy5pYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmljP3RoaXMuaWMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlplPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmhlKSk7dGhpcy5CYigpO2YuS2Moay50bik7KGE9Zi5LYSh0aGlzLklkKCkpKXx8KGE9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZSl7YS5lbmFibGVkPQoiZmFsc2UifXZhciBnPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTsKYiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGEpdHJ5e2U9SlNPTi5wYXJzZShhKX1jYXRjaChnKXtlPXRoaXMucWF9ZWxzZSBlPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxlLnNlcnZlci5sZW5ndGg7YSsrKXt2YXIgYj1lLnNlcnZlclthXTt0cnl7dmFyIGQ7KGQ9dm9pZCAwPT09Yil8fChkPSFiLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5JZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihkKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGUuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmCmUuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZjKCkmJmUuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmUuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaWE9ZS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5IKCJ3ZWIuZGUiKXx8Zi5IKCJnbXgubmV0Iil8fGYuSCgiZ214LmF0Iil8fGYuSCgiZ214LmNoIil8fGYuSCgiMXVuZDEuZGUiKSkmJiF0aGlzLlJjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwKInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuY2koZS5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWUuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlZiPWUuY29uZmlnfHwiIjt0aGlzLkFhPWUuYWxpYXN8fG51bGw7dGhpcy5WZT1lLmFkcGF0aHx8IiI7dGhpcy5CZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5pYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlZiJiZ0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxjaTpmdW5jdGlvbihhKXt0aGlzLmxkfHwodGhpcy5sZD1hfHwiIil9LFRjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBkPXt9O2lmKGEpe3ZhciBkPW5ldyBDKHRoaXMucWMoKSksZT10aGlzLmFhKHRoaXMuVmIpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBDKHRoaXMuVmIrdGhpcy53ZSgiY3VzdG9tZXIiKSk7dGhpcy5MYShkLHRoaXMudm8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGYoImN1c3RvbWVyIik7YT90aGlzLmlrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuaWs9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx2bzpmdW5jdGlvbihhKXtpZighdGhpcy5TKXt2YXIgZD1hLnJlc3BvbnNlVGV4dCxlPXt9O3RyeXtlPUpTT04ucGFyc2UoZCl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApOwpyZXR1cm59fWQ9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihkPSEwKX1jYXRjaChoKXt9aWYoIShkfHxlLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihlLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGUuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxlLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuV2Y9dGhpcy5pYihlLnN0cmljdCk7dGhpcy5hZT10aGlzLmliKGUuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWUuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5iYj10aGlzLmliKGUuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuaXNFbmFibGVkPXRoaXMuaWIoZS5lbmFibGVkKTt0aGlzLldiPWUudGVzdGhpZGV8fCIiO3RoaXMuWWI9ZS50ZXN0YWR0YWdzanN8fGUudGVzdGFkdGFnc3x8W107dGhpcy5iZD1lLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMudGM9ZS50ZXN0M3Bjb29raWV8fCIiO3RoaXMucWI9ZS5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5wYj1lLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5lYz1lLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucWQ9ZS5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZWY9ZS5qc3BvcHVwc3x8ITE7dGhpcy5BYj1lLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1lLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuamI7dGhpcy5LZj1lLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWUuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1lLnZtYXBzfHwiIjt0aGlzLkVjPWUuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1lLmJpdHJhdGV8fDFFMzt0aGlzLmNpKGUuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2Q9ZS5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuWWQ9ZS50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZS52aWRlb3BsYXphfHx7fTt0aGlzLkRiPWUueWllbGRsYWJ8fG51bGw7dGhpcy5QZD1lLnNhbmRib3hzY3JpcHRzfHxudWxsOyF0aGlzLm5jJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5uYz0hMCx0aGlzLlRjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLklvKCkmJih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnhmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpLHRoaXMuQ2UoKSx0aGlzLkJiKCkpOnRoaXMuem8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TZigpKX19LFZtOmZ1bmN0aW9uKGEpe3RoaXMuRmk9ITA7dmFyIGQ9ZnVuY3Rpb24oYSl7aWYoYT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2ErIj0oW147XSspIikpKXJldHVybiBhWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCIsZD10aGlzLkRiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoZCkpLGQ9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmQsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6Zi5yYihkKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2YuU2ModGhpcy5xYygpLCJQT1NUIixkLGZ1bmN0aW9uKGQpe3RyeXt2YXIgZz1KU09OLnBhcnNlKGQucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZ3x8IWcubGVuZ3RoKSwhMCk7dHJ5e2lmKGcmJmcubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGdbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihnWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaChCKXthKCl9YSgpfS5iaW5kKHRoaXMpLApmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSwhMCl9LHpvOmZ1bmN0aW9uKCl7dGhpcy55bygpO3RoaXMuQW8oKX0sQW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBkPSJpbmxpbmVldmFsZGF0YSIsZT0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksQj1mLlYoMTApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwpmLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYuQmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApO3JldHVybn10aGlzLnNhKCJjc3BfIitkKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGQsITApfX0uYmluZCh0aGlzKSwxRTMpfSxTZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5uYikpO3RoaXMuQmIoKX0sWGQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuQ2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKGEpKSx0aGlzLkJiKCksdGhpcy5DZSgpKX0seW86ZnVuY3Rpb24oKXtpZih0aGlzLldiKXt2YXIgYT1mLkJkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5IbSgpKXRoaXMuWGQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuV2IpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5XYik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7dmFyIGU9MD09PWQub2Zmc2V0V2lkdGh8fDA9PT1kLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGQpOwphPWV9Y2F0Y2goZyl7fWE/dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5saSgpfX1lbHNlIHRoaXMubGkoKX0sUWY6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuRG8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlBmLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLlBmKCl9fWZ1bmN0aW9uIGQoKXt0aGlzLlhkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBlPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5QZigpfSxEbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gYz8KKHdpbmRvdy5jbGVhclRpbWVvdXQoYyksITApOiExfXZhciBjPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuTGEobmV3IEMoYSksZyxmdW5jdGlvbigpe2YoKSYmZSgpfSl9LGxpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPWUuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5TYigpKSx0aGlzLkVvKGcsMDxlLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZi5iaW5kKHRoaXMpLGQuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5RZigpfX1mdW5jdGlvbiBkKCl7dGhpcy5YZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGU9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LEVvOmZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBnKCl7YygpJiZkKCl9ZnVuY3Rpb24gZigpe2MoKSYmCmUoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmMoKSYmZigpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1mO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobCl7ZygpfX0sUGY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLlNjKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuaWIoYS5jYyk7dGhpcy5TZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwKITApfWNhdGNoKGEpe3RoaXMuamkoKX1lbHNlIHRoaXMuU2YoKX0samk6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMubmIpKTt0aGlzLkJiKCk7dGhpcy5DZSgpfSxIbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fSxCYjpmdW5jdGlvbigpe3ZhciBhPSIwIixkPSIwIjt0cnl7Zi5EYSgpJiYoYT0iMSIpfWNhdGNoKGUpe2E9Mn10aGlzLnhjJiYoZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5QZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTsKdGhpcy5jZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNlJiZ0aGlzLmNlKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkhifSl9LGNsOmZ1bmN0aW9uKCl7dGhpcy5ZYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlljLmlkPWYuVigxMCk7dGhpcy5ZYy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuWWMpO3ZhciBhPXRoaXMuWWMuY29udGVudFdpbmRvdyxkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZz0wO2c8dGhpcy5QZC5sZW5ndGg7ZysrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5QZFtnXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZC5zcmM9Zi56ZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsCnRoaXMpO2EuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE7YT0oYT1kb2N1bWVudC5jb29raWUubWF0Y2goLyhefCApYWRwX3NlZ3M9KFteO10rKS8pKT9hWzJdOnZvaWQgMDthJiZmLnRyYWNrKCJzdGF0c19oZF9zZWdzIiwiZTAiIT1hLCEwKX0uYmluZCh0aGlzKSwyRTMpfSxvbDpmdW5jdGlvbigpe2lmKHRoaXMuYWUmJnRoaXMucm0oKSl7dmFyIGE9dGhpcy4kbCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0scGk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGQpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxMYTpmdW5jdGlvbihhLGQsZSxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrOwp0aGlzLkhkPnRoaXMub2gmJiF0aGlzLnBoJiYodGhpcy5waD0hMCxmLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMub2gsITApKTthPW5ldyBNYShhLGQsZSxudWxsLGEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5IikmJmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSk7ZyYmKGEuRWk9ITApO2MmJmYuRm0oKSYmKGEuWmc9ITApO2gmJihhLmlpPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtsOmZ1bmN0aW9uKCl7dGhpcy5ZbXx8KHRoaXMuWW09ITAsZi5EYSgpfHxmLmViKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbCxnPSIiO3RyeXsoZD1hLnJlc3BvbnNlWE1MKXx8KGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5zYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGUpaWYoZz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihnWzBdJiYoZz1nWzBdKSxnKXtnPWcmJmcuY2hpbGROb2RlcyYmZy5jaGlsZE5vZGVzWzBdP2cuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5SYygpfHwoZz10aGlzLmFhKGcpLGc9Zy5wcm90b2NvbCsiOi8vIitnLmhvc3QpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Yy5uZXR3b3JrU3RhdGU9PWMuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsZnVuY3Rpb24oKXsiMS4wNCIhPWMuZHVyYXRpb24mJnRoaXMuc2EoIm1lZGlhZmlsZV9kdXJhdGlvbiIpfS5iaW5kKHRoaXMpKTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Yy5hcHBlbmRDaGlsZChkKTtjLnNldEF0dHJpYnV0ZSgic3JjIixnKTtjLmxvYWQoKX1lbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx3bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLHRoaXMuVm8uYmluZCh0aGlzKSx0aGlzLlVvLmJpbmQodGhpcykpfSxWbzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWV8fHRoaXMuSmwoKX0sVW86ZnVuY3Rpb24oKXt9LEpsOmZ1bmN0aW9uKCl7Zi5LYyhrLklsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSwKQ2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5BYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkFiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuQWJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuZWIoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBJO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5lYihkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLllkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBkPQoiIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsZyxmLGMsaCxrLGw9MDtsPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChsKyspLGc9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGY+PjYsaz1mJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihmKSYmKGs9NjQpLGQ9ZCsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGR9LGFhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGc9MTQ7Zy0tOyllW2RbZ11dPWFbZ118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LElmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZyxmLGM9QXJyYXkoODApLGg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEscix1LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8cC0zO2crPTQpZj1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGcpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1lKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO2Y9aDtwPWs7cT1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1lKGYsNSkrKHAmcXx+cCZyKSt1K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2ZvcihnPTIwOzM5Pj1nO2crKyl2PWUoZiw1KSsocF5xXnIpK3UrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWUocCwzMCkscD1mLGY9djtmb3IoZz00MDs1OT49ZztnKyspdj1lKGYsNSkrKHAmcXxwJnJ8cSZyKSt1K2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHU9cixyPXEscT1lKHAsMzApLHA9ZixmPXY7Zm9yKGc9NjA7Nzk+PWc7ZysrKXY9ZShmLDUpKyhwXnFecikrdStjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx1PXIscj1xLHE9ZShwLDMwKSxwPWYsZj12O2g9aCtmJjQyOTQ5NjcyOTU7az1rK3AmNDI5NDk2NzI5NTtsPWwrcSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZChoKStkKGspK2QobCkrZChtKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy51anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gYSgpe30KZi5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuV2t8fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5SP3RoaXMuZ2I9YS5jLlIoKTp0aGlzLmdiPSIiO2EuYy53aCYmYS5jLndoKHtwYXVzZTp0aGlzLk1kLmJpbmQodGhpcykscmVzdW1lOnRoaXMuJGguYmluZCh0aGlzKSxtdXRlOnRoaXMubmYuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Pby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnRiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLlprPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWQ7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVWQ9e307Zi53YigibmV3QmlnQWRJZCIpO3RoaXMuYmw9Zi5WKDEwKTsKdGhpcy5NZj0wO3RoaXMub2Q9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy5vZD1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5vZD1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Uaz1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLldjPXRoaXMuVGQ9ITE7dGhpcy5GaD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMudmU9ITE7dGhpcy50aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZWk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5lZT0KdGhpcy4kYj10aGlzLkdlPXRoaXMueWQ9dGhpcy5WZD10aGlzLkNiPXRoaXMudmM9dGhpcy5PaD10aGlzLkZlPXRoaXMuRGQ9dGhpcy5Kbz10aGlzLkZiPXRoaXMuUWI9ITE7dGhpcy5BYz1bXTt0aGlzLnBjPXt9O3RoaXMubm49MjAwO3RoaXMuZGc9dGhpcy5kZD10aGlzLkZjPXRoaXMuY2c9dGhpcy53Zj0hMTt0aGlzLnBmPXt9fWMub2o9YTthLnByb3RvdHlwZT17U246ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5nYl0mJnRoaXMuY29uZlt0aGlzLmdiXVthXSYmKGQ9dGhpcy5jb25mW3RoaXMuZ2JdW2FdKTtyZXR1cm4gZH0scmk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLm9vKCk7Zi5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saGY6ZnVuY3Rpb24oYSxkLGUsZyl7dGhpcy5GYj0KZTt2YXIgYz0hMTtnJiZnLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYz0hMCk7aWYodGhpcy5BLlMpdGhpcy5NZisrLGYud2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQS5vbCgpLGc9bC5nZXRDb25maWcoKSxmLkhlJiYodGhpcy5BLlRuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxmLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkEuQ2EmJnRoaXMuQS5pc0VuYWJsZWQ/KHRoaXMucmkoKSxuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZCxiaXRyYXRlOmcuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZD8odGhpcy5yaSgpLApuZXcgUyh0aGlzLGEsdGhpcy5GaCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQS5qYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmcuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgaD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmhmKGEsZCxlKX0sNTApfX0sdGY6ZnVuY3Rpb24oYSl7YS5aYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJhZCIsITApO3RoaXMuZWU9dGhpcy4kYj10aGlzLkZlPXRoaXMuRGQ9ITE7dGhpcy5iPWE7dGhpcy5pbyh0aGlzLmIpO3RoaXMua2goYSk7dGhpcy5BYz10aGlzLmFoKGEpO3RoaXMuc2woKX0sa2g6ZnVuY3Rpb24oYil7YiYmCihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mIGEmJih0aGlzLlVkPXRoaXMua20oYikpLHRoaXMua2goYi5wYXJlbnQpKX0sYWg6ZnVuY3Rpb24oYil7dmFyIGQ9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoZD10aGlzLmFoKGIucGFyZW50KSksZC5wdXNoKHRoaXMuVWwoYikpKTtyZXR1cm4gZH0sVWw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT1bXTtpZihhJiZhLkwmJmEuTC5nZXRBdHRyaWJ1dGUpe2Q9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyllLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWUubGVuZ3RoJiYoZT1lWzBdKX1yZXR1cm57YWRJRDpkLGNyZWF0aXZlSUQ6ZX19LGttOmZ1bmN0aW9uKGEpe3ZhciBkPVtdLGU9W10sZz0KW10sZj1bXSxjPSIiO2lmKGEuTCl7ZD1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtnPWEuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkwuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChjKSk7YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1hLkwuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGMpKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKylnW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGM9Z1toXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGMpKSxnW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoYz1nW2hdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChjKSk7Zm9yKGg9MDtoPGQubGVuZ3RoO2grKyllLnB1c2goYS51YihkW2hdKSl9cmV0dXJue2ltcHJlc3Npb25zOmUsYWRJZHM6ZixhZElkOmN9fSxyYTpmdW5jdGlvbihhKXthLlphJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLAoibm9hZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5BZCYmYS5BZC5lcnJvciYmYS5BZC5lcnJvci5jb2RlJiYoZD1hLkFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZmQuY29kZTpkPT1GLm1lLmNvZGU/Zi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZi5qZigpLGQ9PUYuaGcuY29kZSYmZi5vKGsuZW4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7Zi5vKGsuSGwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnBvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5IYiwKITApO2JyZWFrO2Nhc2Ugdi5mZy5jb2RlOmYubyhrLldvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaWcuY29kZTpmLm8oay5ycCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5uZS5jb2RlOmYubyhrLnNwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuamUuY29kZTpmLm8oay5mbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuZ2UuY29kZTpmLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuZWcuY29kZTpmLm8oay5Ubyx0aGlzLmIucywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMua2MoYSk7dGhpcy5SYSgpfSxrYzpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPXsiW0VSUk9SQ09ERV0iOmR9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGU9YS5QYS5wb3AoKTt0aGlzLmdmKGUudXJsLGUudHlwZSxkKX1jYXRjaChnKXt9fSxpbzpmdW5jdGlvbihhKXt0aGlzLkdlPSExO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBkPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGQ9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmtiLnpJbmRleD1kO2Q9dGhpcy5hLkI7dHJ5e3ZhciBlPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLApnPSIiO2UmJmUuZW52dmFycyYmKGc9ZS5lbnZ2YXJzKCkpO2cudmlkZW9TbG90fHwoZT10aGlzLmEuYykmJmUuRmQmJihnPWUuRmQoKSk7Zy52aWRlb1Nsb3QmJihkPWcudmlkZW9TbG90LHRoaXMud2Y9ITApfWNhdGNoKGMpe31kLnJxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihkLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZC5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgaCBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShoKSYmZC5zZXRBdHRyaWJ1dGUoaCx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtoXSk7dGhpcy5UayYmdGhpcy5wbGF5ZXIuT2UoKSYmKGQudm9sdW1lPQp0aGlzLnBsYXllci5PZSgpLzEwMCk7Zm9yKDtkLmZpcnN0Q2hpbGQ7KWQucmVtb3ZlQ2hpbGQoZC5maXJzdENoaWxkKTtmb3IoZT0wO2U8YS5PLmxlbmd0aDtlKyspZC5jYW5QbGF5VHlwZShhLk9bZV0udHlwZSkmJnRoaXMuT2soZCxhLk9bZV0udXJsKyIiLGEuT1tlXS50eXBlKTt0aGlzLndmJiZkLmxvYWQoKTtpZih0aGlzLm1pKGQpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlJrKGQpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy53Zj90aGlzLnZpZGVvPWQ6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGQpfWNhdGNoKGspe3RoaXMudmlkZW89CmR9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5rYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCksdGhpcy5mbygpKTp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxmbzpmdW5jdGlvbigpe3RoaXMuY2c9ITA7dGhpcy5DYj10aGlzLnZjPSExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoZi5vKGsuTGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLkNiPSEwKTtmLkRlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLmJhJiZmLlNrKHRoaXMuYi5vcmlnaW4uYmEpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5COwp0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlBoKCk7dGhpcy5hLkpmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5KZigpO3RoaXMua2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZi5IZih0aGlzLmtiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLkNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuVWIoIm11dGVkIiwiY29udGVudCIpO2YubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwp0aGlzLkQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZmLkhmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5ubSgpLGc9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmCmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgYz10aGlzLkEuZ2V0Q29uZmlnKCk7YyYmYy5hZEZhbGxiYWNrQ29uZmlnJiZjLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihnPUpTT04uc3RyaW5naWZ5KGMuYWRGYWxsYmFja0NvbmZpZykpfXZhciBoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpnLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmd9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtmLm1hKHRoaXMuRCwiY29uZmlnIixoKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIiwKaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLnplKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkQuc3JjPWE7Zi54ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5tYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5BYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLmVwKCksdGhpcy5hLm1jKCEwKSwhdGhpcy4kYikpe3ZhciBiPTJFMyxnPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihnPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy4kYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5lZT0hMDtmLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpnLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYS5tYyghMCksdGhpcy5tcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5scCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLm5wKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Y3x8KGM9dGhpcy5iLnNiKTtpZighYylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5FY3x8dGhpcy5kZClhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLAphKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWN9Y2F0Y2goZCl7d2luZG93Lm9wZW4oYyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaHAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmRkJiYodGhpcy5kZz0hMSx0aGlzLnNjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5DYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5LZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5DYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuVWIoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsuVWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZi5vKGsudGUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLnhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2YueGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7Zi5tYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpOwp0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnZjPSEwfSxncDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy52Yz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay51Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTsKdGhpcy5naSgpO2YubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG1wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2YubyhrLm1kLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuRGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLm1nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2YubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMudSgpKX0sanA6ZnVuY3Rpb24oKXt0aGlzLllmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sQ2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5EJiZ0aGlzLkQucGFyZW50Tm9kZSYmdGhpcy5ELnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5EZSgpO3RoaXMuRD0hMTt0aGlzLlJhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixlPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChlKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2YubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LApPazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGUoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUmMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9ZShkLHRoaXMuQSk7Zy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZShkLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sUms6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLAp0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy4kZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5ZZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlpmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmpjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamN8fHRoaXMuJGYoYSl9LmJpbmQodGhpcyksCnRoaXMuWmspKX0sJGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmQmJnRoaXMubWkodGhpcy52aWRlbykmJiF0aGlzLlFiJiYhdGhpcy5qYyl7dGhpcy5yZD0hMDt0cnl7aWYoIWYuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuUWJ8fCh0aGlzLlFiPSEwLHRoaXMuT2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5TZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5KZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy5CZygpO3RoaXMuYS5QaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5OZigpfX0sTmY6ZnVuY3Rpb24oKXt0aGlzLnlkfHwKdGhpcy5uZygpfSxuZzpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnlkfHwoYT90aGlzLlJhKCk6KHRoaXMubmYoITApLHRoaXMubmcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLnJjLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LmJpbmQodGhpcyk7dGhpcy5RZSgpLmRpKHRoaXMpfSxZZjpmdW5jdGlvbigpe3RoaXMuQS5iYiYmIXRoaXMuUWImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTsKdGhpcy5GZT0hMDtmLm8oay5Jayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUmEoKX0sTGs6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGU9ITEsZz0wO2c8YS5sZW5ndGg7ZysrKWU9Zi5maChhW2ddKSxkLnB1c2goZSk7YT17aGFzaGVzOmR9O2E9ay5UYShhLHRoaXMudSgpKTtmLm1vKGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5mZSYmdGhpcy5Mayh0aGlzLmIuZmUpO2lmKCF0aGlzLkdlKWlmKHRoaXMuR2U9ITAsdGhpcy5lZXx8KGYubyhrLmpuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLkVifHx0aGlzLmIueWMpe2Yud2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuTWYrKzt0aGlzLmpjPXRoaXMucmQ9ITE7dHJ5e3RoaXMuT2QodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy5rYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChnKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnZpKCl9Y2F0Y2goYyl7fXRoaXMuVmQ9ITA7dGhpcy5hLlVlKCk7dGhpcy5vYz0hMTt0aGlzLlFlKCkuWWgoKTt0aGlzLmIuRWImJnRoaXMuYi5vcmlnaW4ub2YoKTt0aGlzLmIueWMmJihhP3RoaXMuYi5vcmlnaW4uSWgoKTp0aGlzLnhkKCkpfWVsc2UgdGhpcy54ZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLk9kKHRoaXMudmlkZW8pLHRoaXMuWmYoYSkpfSxaZjpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5rbCgpOwp0aGlzLmIub3JpZ2luLlVnKHYuamUpfSxBaTpmdW5jdGlvbigpe2lmKHRoaXMuSm8pdGhpcy5SYSgpO2Vsc2V7dGhpcy5vYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmYubyhrLkhjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk1vKGEpO2lmKCF0aGlzLiRiKXt2YXIgZD0yRTMsZT01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZT10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmVlPSEwO2YubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmQscGVyY2VudDplLHN0YXJ0VGltZTohMX07Zi5hZih0aGlzLiRiKX1lPSIiO3RoaXMuYi5MZiYmKGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZT10aGlzLmIuTGYtYSwwPGU/ZT10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixlKTooZT10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGUpLHRoaXMuVGR8fCh0aGlzLlRkPSEwLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2YubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLkViPyh0aGlzLmpjPXRoaXMucmQ9ITEsdGhpcy5PZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEudmkoKSx0aGlzLmIub3JpZ2luLm9mKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxkLmlubmVySFRNTD1lKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMub2QucmVwbGFjZSgiW3RpbWVdIixmLiRnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5PaHx8KHRoaXMuT2g9ITAsdGhpcy5EZHx8Zi50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE1vOmZ1bmN0aW9uKGEpe2YubyhrLnRlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5RYnx8KDA9PWEmJih0aGlzLkZiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkZiKSx0aGlzLkZiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksCnRoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuSGIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5RYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmJiJiZ0aGlzLlhhKCJzdGFydCIpLGYubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksCnRoaXMuRGQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5iYiYmKGYudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGYubyhrLnJnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxmLm8oay52Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGQpe2YudHJhY2soInN0YXRzX2hkX2FkXyIrCmEsZCwhMCl9LG9vOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxnaTpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scG86ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7Zi5jZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5jZ3x8dGhpcy5BLmJiKSYmZi50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFViOmZ1bmN0aW9uKGEsZCl7dGhpcy5BLmJiJiZmLnRyYWNrKCJzdGF0c19oZF8iK2EsZCwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZCl7aWYoIXRoaXMuUWIpe3RoaXMucGYmJgp0aGlzLnBmLnRyYWNrJiZ0aGlzLnBmLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZi5IZSYmZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGU9W107dHJ5e2U9dGhpcy5sbSh0aGlzLmIuUGEsYSl9Y2F0Y2goZyl7ZT1bXX1mb3IoO2UubGVuZ3RoOyl0cnl7dmFyIGM9ZS5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkZjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuVWQuaW1wcmVzc2lvbnMmJmYuRG0oYy51cmwsdGhpcy5VZC5pbXByZXNzaW9ucyk/dGhpcy5nZihjLnVybCxjLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsuSmssdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5nZihjLnVybCxjLnR5cGUpfWNhdGNoKGgpe31pZighZCl0cnl7dGhpcy5iLlBhPXRoaXMuRGwodGhpcy5iLlBhLGEpfWNhdGNoKGwpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWYuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLmNnJiYoZD0iX3ZwYWlkIik7dGhpcy5kZCYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxnZjpmdW5jdGlvbihhLGQsZSxnLGMpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuQS53YShhKSxlJiZkLk5rKGUpLGd8fChnPXRoaXMuUmcpLGN8fChjPXRoaXMuUmcpLHRoaXMuUGsoYSksdGhpcy5BLkxhKGQsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7YygpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFBrOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09CiJvcGVuIn0sWGg6ZnVuY3Rpb24oYSl7dGhpcy5wY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLnBjPXt9fSxybzpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLnBjKXRoaXMucGMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5wY1tkXSYmYSsrO3JldHVybiBhfSxsbTpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LERsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS54ZyYmYS54Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZi5EYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5zYygpOwplbHNlIGlmKHRoaXMuYi5zYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5FZXx8KHRoaXMuYi5FZT0xKTtpZigxMDA+YS10aGlzLmIuRWUpcmV0dXJuO3RoaXMuYi5FZT1hfWNhdGNoKGQpe31mLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuRWN8fHRoaXMuZGQpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIuc2J9Y2F0Y2goZCl7YT13aW5kb3cub3Blbih0aGlzLmIuc2IsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYi5zYiwiX3RvcCIpfX19LmJpbmQodGhpcyksCjUwMCl9fSxYbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZygwKSk7CnZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS50ZCYmKGQ9dGhpcy5BLnRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sUmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS50ZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFmLk9mKHRoaXMuY29udHJvbHMpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwplLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihlLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuUmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mby5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLktvLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLmVpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7CmUuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLkxmJiZlLmFwcGVuZENoaWxkKGgpO2UuYXBwZW5kQ2hpbGQoYyk7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtmLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGUuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS55ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLkxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5uZigpKTt0aGlzLktiKCl9fSxLYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmRnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnJlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLnZjPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudmM9ITEpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuS2IoKSx0aGlzLkpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy52Yz0hMCl9LE1kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsucmUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sS286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwidXNlciIpLGYubyhrLktkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxMbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpOwp0aGlzLkNiPyhmLm1hKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQ2I9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYubWEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQ2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbmY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJjb250ZW50IiksZi5vKGsuS2QsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE9vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwiY29udGVudCIpLGYubyhrLlVmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxyYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnJjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYyk7dGhpcy55ZHx8dGhpcy52ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTmYoKSl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5NbSgpJiZ0aGlzLkxtKCkmJih0aGlzLkEueGN8fCJzcGllZ2VsLmRlIj09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWYuTmImJnRoaXMuTm8oKXx8KHRoaXMueWQ9ITAsdGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy5NZygpKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCk7aWYoIXRoaXMuQS5qYnx8Zi5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGQ9dGhpcy5BLmpiPyIiOiJub3ZwYWlkIixlPWYuRGEoKT8ibW9iaWxlIjoiIjtmLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZCtlKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmpiJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LExtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuV2N8fChhPQohMCxkLmFkRmFsbGJhY2tVUkx8fChkLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkZjJiZkLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY3x8Zi50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRmM/ImFueSI6IiIpKyhkLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5XYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRmMmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLldjfSxhbTpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sTm86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZC5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmQuYXZhaWxhYmxlKXtmLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1mLnplKGUsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5oZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy54ZCgpfXZhciBkPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxlPXRoaXMuYW0oKTt0aGlzLkZjPXRoaXMuV2M9dGhpcy5kZD10aGlzLmRnPSEwO3JldHVybiBkPyhmLmViKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2QsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LE1nOmZ1bmN0aW9uKGEpe3RoaXMucm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1nKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5ubik6KHRoaXMuVmQ9ITAsdGhpcy5hLlVlKCksdGhpcy5hLlJuKCksdGhpcy5vYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkZlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGYubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5RZSgpLlloKCkpfSxRZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxCZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihmLiRlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuTWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5zYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5BYyYmMDx0aGlzLkFjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5BYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ibCsiLSIrdGhpcy5NZjt0aGlzLmImJnRoaXMuYi5naCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZ2goKSk7cmV0dXJuIGF9LFJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5wbXx8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixlLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtkPWU7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMub2E9bnVsbDt0aGlzLlk9W107dGhpcy5MPW51bGw7dGhpcy56Yz10aGlzLkJjPSExO3RoaXMuYmE9IiI7dGhpcy5iZz0hMTt0aGlzLnJoPSIiO2MmJmMuZW1wdHk/dGhpcy5VbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLnJrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLkJkKCksYjtiPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwud2EobC5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZi5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksYz1mdW5jdGlvbigpe3JldHVybiBlKCkmJihmLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGYuSCgiZmFuZG9tLmNvbSIpfHxmLkgoImdpZ2EuZGUiKXx8Zi5IKCJraW5vLmRlIil8fGYuSCgic3BpZWxldGlwcHMuZGUiKXx8Zi5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGUoKXx8YygpKXt2YXIgaD1mLk9nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxtPWZ1bmN0aW9uKCl7cmV0dXJuKGYuSCgiZ2lnYS5kZSIpfHxmLkgoImtpbm8uZGUiKXx8Zi5IKCJzcGllbGV0aXBwcy5kZSIpfHxmLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxwPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoYygpfHxrKCl8fG0oKXx8ImFwcHNwb3QiPT1kKXAoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLldkKGgpKSsiJnR5cGU9anMiLGI9bC53YShsLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZi50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bC53YShsLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5MYShiLHRoaXMuVG0uYmluZCh0aGlzKSx0aGlzLlFtLmJpbmQodGhpcykpfSxiaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLk5iKXRyeXt2YXIgZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWUuZmlyc3RDaGlsZH1jYXRjaChnKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGUpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5OYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuTmJ8fHRoaXMuSm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwud28oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtlW2JdPWMuZmlyc3RDaGlsZDtkLnB1c2goYyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGU9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2U9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGUmJk1hdGguYWJzKGUtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxUbTpmdW5jdGlvbihhKXt0aGlzLkJuKGEpO3RyeXt0aGlzLm9hPWEucmVzcG9uc2VYTUwsdGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLnJoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWS5sZW5ndGgpdGhpcy5WYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlNhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5tZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuS2EodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxVbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8Cih0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5TYSh2Lm5lKSl9dGhpcy5ZPXRoaXMuYmgoKTt0aGlzLkJjPXRoaXMuUmYoKTt0aGlzLnpjPXRoaXMua2koKTt0aGlzLlkubGVuZ3RoP3RoaXMuVmMoKTp0aGlzLnJhKHRoaXMuU2Eodi5mZCx7ZXJyb3I6dGhpcy5iZz9GLm1lOkYuZ2d9KSl9LFFtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlNhKHYuZmcse2RlcHRoOmJ9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWS5zaGlmdCgpO3RoaXMuTm0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubGgoKSxkLHtBZFN5c3RlbTp0aGlzLlRsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5TYSh2LmlnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMudGYodGhpcy5CbCgpKSl9LG9mOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsCnRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQub2YoKX0sSWg6ZnVuY3Rpb24oKXt0aGlzLnpjPyh0aGlzLnpjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LkloKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLk1jKCk/dGhpcy5yYSh0aGlzLlNhKHYuZ2UpKTp0aGlzLnJhKHRoaXMuU2Eodi5lZykpLCExKToodGhpcy5yYSh0aGlzLlNhKHYuZmQsRi5oZykpLCExKX0sdGY6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZmV8fChhLmZlPVtdKTthLmZlLnB1c2godGhpcy5yaCk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLmtmKCkpO2EuRWI9YS5FYj9hLkViOnRoaXMuQmM7YS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTGM7YS4kYT1hLiRhPwphLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3RoaXMucGFyZW50LnRmKGEpfSxCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5kdXJhdGlvbj10aGlzLk1jKCk7YS5PPXRoaXMuaWgoKTthLnNiPXRoaXMuV2woKTthLnlxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuU2woKTthLkxmPXRoaXMuam0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkxjO2EuJGE9CmEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5MYztpZighdGhpcy5MJiZ0aGlzLm9hJiZ0aGlzLm9hLmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5MPXRoaXMub2E7dHJ5e2lmKHRoaXMuTCYmdGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKXt2YXIgZD0hMTsoZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVycm9yIikpJiZkLmxlbmd0aCYmZi50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGUpe319dGhpcy5MJiYoYS5QYT1hLmVycm9yLmNvZGUhPXYuZ2UuY29kZT9hLlBhLmNvbmNhdCh0aGlzLlhsKCkpOmEuUGEuY29uY2F0KHRoaXMuZm0oKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5rYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJgp0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShhKSxiPTApfSxrYzpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5rYyhhKX0sVWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGQ9bmV3IFRhKGEsYik7ZC5vcmlnaW49dGhpcztyZXR1cm4gZH0sRm86ZnVuY3Rpb24oKXtyZXR1cm4gYjxkfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaWgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5NYygpfSxSZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5SZigpJiYKKGE9ITApO3JldHVybiBhfSxCbjpmdW5jdGlvbihhKXt0aGlzLmJhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMuYmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5iYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuYmc9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goZCl7fX0sTm06ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxoKCkubGVuZ3RofSxsaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGUodGhpcy5MLCJBZFN5c3RlbSIpfSxrZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkuZm9yRWFjaChmdW5jdGlvbihhKXt0cnl7aWYoIlRyYWNraW5nIj09ZSYmYSYmYS5wYXJlbnROb2RlJiYiVHJhY2tpbmdFdmVudHMiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUmJihhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIk5vbkxpbmVhckFkcyI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lfHxhLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnloKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZS50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnViKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PQphLm5vZGVOYW1lPyEwOnRoaXMueWgoYS5wYXJlbnROb2RlKTohMX0sZm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sWGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGloOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbZF0uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUcDphW2RdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy51YihhW2RdKX0pO3ZhciBlPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgYz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhlLWEuUWEpLU1hdGguYWJzKGUtYi5RYSl9KSxmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5RYSktTWF0aC5hYnMoZS1iLlFhKX0pLGI9Yy5jb25jYXQoZil9Y2F0Y2goaCl7fXJldHVybiBifSxTbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsZD0hMSxlPVtdLGI9ITEsYz0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtjPWI9dGhpcy5HZChhW2hdKTt0cnl7ZD1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2Q9Yn1lLnB1c2goZCk7Zi5wdXNoKGMpfTE8YS5sZW5ndGg/KGI9ZSxoPWMpOihiPWQsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sTWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy51Yih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGptOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsZT0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGU9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWYubG8oZSwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goYyl7Yj0hMX1yZXR1cm4gYn0sUGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnViKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5HZChhKToiIn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucmt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy52a3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuc2I9IiI7dGhpcy5zPXRoaXMueWM9dGhpcy5FYj0hMTt0aGlzLldlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5YZT0iIn1jLlpqPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGQ9MDtkPHRoaXMuTy5sZW5ndGg7ZCsrKWlmKDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5vYSl7dmFyIGE9dGhpcy5vcmlnaW4ub2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKShkPWFbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9ZC5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5XZT1hW2VdKX1yZXR1cm4gdGhpcy5XZX0sCmdoOmZ1bmN0aW9uKCl7aWYodGhpcy5YZSlyZXR1cm4gdGhpcy5YZTt2YXIgYT0iIjsoYT10aGlzLmRtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5YZT1hfSxubTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLk8ubGVuZ3RoO2QrKylpZigwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tkXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuWmp8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZhPWMuVWt8fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtuZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixPYToiWE1MX1BBUlNFX0VSUk9SIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxmZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsT2E6IkVNUFRZX1ZBU1QifSxpZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixPYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk9hOiJMT0FEX0VSUk9SIn0samU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE9hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdHA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsT2E6Ik1FRElBRklMRV9FUlJPUiJ9LGdlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE9hOiJEVU1NWV9BRCJ9fSxGPXtnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE9hOiJOT19BRFMifSxoZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsT2E6Ik5PX01FRElBRklMRVMifSx1cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsT2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxtZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixPYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLnNufHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuZXJyb3I9YTt0aGlzLkFkPWQ7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmVqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT0KYy5Ya3x8WGE7bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1kO3RoaXMuYmU9W107dGhpcy5XaD1bXTt0aGlzLnFmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLnZwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGQ9dGhpcy5aaFthXSxlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LApjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTt2YXIgaD1mLmNvbnRlbnRXaW5kb3c7aC5ucT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Hbi5iaW5kKHRoaXMpfTt2YXIgaz1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZTtoLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7aC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspOwp0aGlzLmJlLnB1c2goe3NyYzplLGZyYW1lOmYscW46Yyx2ZW5kb3I6ZC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMucWYubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5xZltkXTtlLnR5cGU9PT1hJiZlLmZsKHRoaXMuWWwoYSkpfX0sWWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7d3E6ITAsdnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7a3E6InZpZGVvIix6cToianNDdXN0b20iLEFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQnE6MSxVcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxtbTpmdW5jdGlvbihhKXtmb3IodmFyIGQ9MDtkPHRoaXMuYmUubGVuZ3RoO2QrKylpZih0aGlzLmJlW2RdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYmVbZF0ucW47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsZCl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5tbShkKSx2ZW5kb3I6ZH0pO3RoaXMubm8oKX0sR246ZnVuY3Rpb24oYSxkKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnpnKGEsZCl9LmJpbmQodGhpcykpOnRoaXMuemcoYSxkKX0semc6ZnVuY3Rpb24oYSxkKXt0aGlzLnFmLnB1c2goe3R5cGU6YSwKZmw6ZCx0cTohMX0pfSxubzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuR218fChhLm1xKHthZFNlc3Npb25JZDpmLlYoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnhxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5HbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLk1pfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuY29uZj1kfHx7fTt0aGlzLmM9YTt0aGlzLnRiPWEuZGgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQpmLlYoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkhhPXt9O3RoaXMuQWc9ITE7dGhpcy5mYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3ZhciBkPXt9LGU9ITEsYz0wLGQ9MCxmPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9ImZpeGVkIixjPWQubGVmdCxkPWQudG9wKTtmPXt4OmMseTpkfTtmLnBvc2l0aW9uPWU7cmV0dXJuIGZ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUWwoYSk7Zm9yKHZhciBkPTAsZT0wLGM9ITEsZj10aGlzLnZtKGEpLGg9e307YTspZCs9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZSs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtmJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGQrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGUrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGM9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6ZCx5OmV9O2MmJihoLnBvc2l0aW9uPWMpO3JldHVybiBofSx1bzpmdW5jdGlvbigpe3RoaXMuQWc9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sUGg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtmLm8oay5IYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLkFnfHwodGhpcy5jLnBsYXkoKSxmLm8oay53ZCx0aGlzLmMubCgpKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnRiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy50Yi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy50Yi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLnRiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMudGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMudGIpO3RoaXMuYy5aYyYmdGhpcy5jLlpjKCk/dGhpcy5jLmRoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sdm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGU9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxkJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2U9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBlfSxObDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmdldFBvc2l0aW9uKGEpO2QucG9zaXRpb24/ZC5wb3NpdGlvbj1kLnBvc2l0aW9uOmQucG9zaXRpb249ImFic29sdXRlIjtkLndpZHRoPWEub2Zmc2V0V2lkdGg7ZC5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGR9LG1jOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuTmwodGhpcy50Yik7aWYoZC54IT10aGlzLkhhLnh8fGQueSE9dGhpcy5IYS55fHxkLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxkLndpZHRoIT10aGlzLkhhLndpZHRofHxkLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09ZC53aWR0aCYmMD09ZC5oZWlnaHQpe3RoaXMuVWUoKTtyZXR1cm59dGhpcy5IYT1kO3RoaXMuYy5aYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmQueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9ZC55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1kLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1kLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1kLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdGhpcy5mY1thXSh7d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KX1mLk9mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LHlnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5mYy5wdXNoKGEpfSxVZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5janx8WmEsRD1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9Zi5WKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5HbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMuR2x8fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5QZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlVhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGQ9dGhpcy5VYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBiYj1jLlNqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLmRjPXRoaXMuZGN8fCExO3RoaXMucWc9dGhpcy5zZz10aGlzLnZoPXRoaXMudmE9dGhpcy5UZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkxsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5UZj0hMDt0aGlzLnZoJiZ0aGlzLkhnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuTWI7YSYmYS5vYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51ZCgpO3RoaXMudmg9ITA7dGhpcy5IZygpfS5iaW5kKHRoaXMpKTt0aGlzLkRnKCl9LEhnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3RoaXMudWQoKTtpZighdGhpcy5UZiYmIXRoaXMudWQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlRmJiZ0aGlzLnFnJiYhdGhpcy5zZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxqaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKZD0wO2Q8Yi5tb2R1bGVzLmxlbmd0aDtkKyspe3ZhciBlPWIubW9kdWxlc1tkXTtpZihlLm5hbWU9PT1hKXJldHVybiBlLmluc3RhbmNlfX0sRGc6ZnVuY3Rpb24oKXtpZih0aGlzLnVkKCkpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5zZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnFnPWEuUnB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMDApfSxWcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5pcSgpOiExfSxNYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuTWMoKTotMX0sZ206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LExsOmZ1bmN0aW9uKGEsYil7dGhpcy5kYz1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLmRjfHwzMDI9PXRoaXMuZGM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuZGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmphKCkpOmEuWWUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5nbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgY2I9Yy5Sanx8Y2I7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5jay5Hay5Faz93aW5kb3cuT08uY2suR2suRWsuUHAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5SZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgZD1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IGNiKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlRqfHxkYixlYj1uZXcgZGIodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZiPWMuWWt8fGZiO25ldyBmYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlRpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuaGE9ITE7dGhpcy5taCgpfSxtaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy5TaCgpfSxTaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBnYj1jLlRpfHxnYjsoZnVuY3Rpb24oYyl7Yy5TaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxFZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkVnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRWcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlNpfHxoYjsoZnVuY3Rpb24oYyl7Yy5VaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLlVpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLm1ufHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMua24oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cucW0oKX0sa246ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZDtmb3IoZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkpe2I9CmlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGI9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylhLnB1c2goYltkXSk7dGhpcy5MZCYmKGE9Zi5FbChhLHRoaXMuTGQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZT1uZXcgVShlKTtpZighdGhpcy5NKGUpKXt0aGlzLk4oZSk7dmFyIGM9bmV3IFYoZSx0aGlzLkYpO2MuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihkPWFbYl07ZC5wYXJlbnRFbGVtZW50Oyl7dmFyIGQ9ZC5wYXJlbnRFbGVtZW50LGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkxkfHwodGhpcy5MZD1bXSksdGhpcy5MZC5wdXNoKGFbYl0pLGU9bmV3IFUoaCksdGhpcy5NKGUpfHwodGhpcy5OKGUpLGM9bmV3IFYoZSx0aGlzLkYpLGMuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbmQ6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwKKHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goZCl9LEdvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy56ZigpLHRoaXMuZigpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2RdJiYwPHRoaXMuY2FbYl1bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtiXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbYl1bZF1bZV0oYSl9fSxxbTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sZD1iLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihlPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtkXVtlXSYmMDx0aGlzLmNhW2RdW2VdLmxlbmd0aClmb3IodmFyIGM9MDtjPHRoaXMuY2FbZF1bZV0ubGVuZ3RoO2MrKyl0aGlzLmNhW2RdW2VdW2NdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5HbyhhKX19KX0pKGMpO3ZhciBrYj1jLm1rfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy52aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMudmp8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUGl8fG1iOyhmdW5jdGlvbihjKXtjLlFpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYjsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPWFbYl0sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChjKXtlPWQuaWR9aWYoZSYmJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IG1iKGUpO3RoaXMuTShmKXx8Cih0aGlzLk4oZiksKG5ldyBuYihmLHRoaXMuRikpLmYoKSl9Y2F0Y2goaCl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgZCBpbiB0aGlzLk1hKWlmKGI9PXRoaXMuTWFbZF0uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYS5rYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlJpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5MaXx8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuT2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KZz10aGlzLkpjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnRsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51bCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRsPSEwKTt2YXIgYj10aGlzLldnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5KYz1iKTtpZighdGhpcy5KZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5KZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlcoYik7dGhpcy5Gbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuaGN8fCh0aGlzLmhjPVtdKTt0aGlzLmhjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuSmMpcmV0dXJuIHRoaXMuSmM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuV2coYSkpcmV0dXJuIHRoaXMuSmM9YX19LFdnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRm46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sd2g6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuTmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm5hKCkpO2IuVWEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpPwp0aGlzLkMoKToodGhpcy5JZXx8KHRoaXMuSWU9MSksdGhpcy5JZSsrLDEwMDx0aGlzLkllP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Oanx8c2I7KGZ1bmN0aW9uKGMpe2MuUGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBhPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoO2UrKylkPW5ldyByYihhW2VdKSx0aGlzLk0oZCl8fCh0aGlzLk4oZCksKG5ldyBzYihkLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Qanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlptPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHViPWMuWm18fHViO25ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMueGt8fHZiOyhmdW5jdGlvbihjKXtjLndrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE9jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxEbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmhifHwodGhpcy5oYj1bXSk7dGhpcy5oYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuamEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkRuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuT2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy5DYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5oYiYmdGhpcy5oYi5sZW5ndGgmJjE8dGhpcy5oYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmhiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmhiW2JdJiYzMDMhPXRoaXMuaGJbYl0mJjQwMyE9dGhpcy5oYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMud2t8fHdiOyhmdW5jdGlvbihjKXtjLnlrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGQ9bmV3IHZiKGEuaXRlbShiKSk7dGhpcy5NKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGQpLChuZXcgd2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMueWt8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk9sfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMudWY9ITF9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnduKCl9LmJpbmQodGhpcyksNTAwKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMudWYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxxbzpmdW5jdGlvbigpe3RoaXMudWY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmdrfHxBYjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51Y3x8KHRoaXMudWM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWG0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnFvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQmI9Yy5ma3x8QmI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmhrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5OaXx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuZWt8fEZiOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlVhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5JYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuT20oKTp0aGlzLkdnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LE9tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuT3AmJmEuUXAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxHZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBkO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihkIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2RdKXtkPWFbZF07YnJlYWsgYX1kPXZvaWQgMH0xMDA5PT1kfHwzMDM9PWR8fDQwMz09ZD8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixkKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVWEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YiYmKHRoaXMuTWg9YVtkXSk7cmV0dXJuIHRoaXMuTWh9LGpxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5JYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmRrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdJiZiW2RdLmZlcm1vZCYmYS5wdXNoKGJbZF0uZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2RdJiZiW2RdLnBhcmVudEVsZW1lbnQmJmJbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5nZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMuJGl8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVyhiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxocTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWYuS2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApaYzpmdW5jdGlvbigpe3JldHVybiEwfSxVYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy52Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnZmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBkPWEucGxheWVyQ29udGFpbmVyO2QmJnRoaXMudmYmJmQhPXRoaXMudmZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGYuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEub3EpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1iLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2VdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy56ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLk1qfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLnhvfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsZD0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGQ9YS5HZXRFbCgpLGImJmQ/KHRoaXMuVChkKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGhuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLmhhbmRsZUVycm9yKGJbZF0pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5CZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9bmV3IE5iKGFbYl0pO2QuaGF8fHRoaXMuTShkKXx8KHRoaXMuTihkKSwobmV3IE9iKGQsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMuUWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxkPSExO2E/KGQ9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmZD8odGhpcy5UKGQpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxobjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLldpfHxTYjsoZnVuY3Rpb24oYyl7Yy5YaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkJlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiOyhmdW5jdGlvbihjKXtjLllpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgZD1uZXcgU2IoYVtiXSk7ZC5oYXx8dGhpcy5NKGQpfHwodGhpcy5OKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyBUYihkLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuWWl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLkhvfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlcoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LCRkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxFbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy4kZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZWQmJih0aGlzLiRkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuJGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkJrfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxWaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmguYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSGs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkhrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WaCgpO3RoaXMubGcoKTt0aGlzLkhuKCl9LEhuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuQ24/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuQ249ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy5Ba3x8WWI7KGZ1bmN0aW9uKGMpe2MuQ2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5FbigpLGE9bmV3IFliKGEsCnRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkNrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMudW18fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKZHx8KGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuVyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuY249YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5aZChhKX0uYmluZCh0aGlzKSl9LFpkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlFoJiYodGhpcy5RaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMucGt8fE47KGZ1bmN0aW9uKGMpe2Mub2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5OZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5jbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnliKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBkPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWQ9ITA7ZHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmhhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLnpmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5xa3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Zaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuWWp8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkZqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRmp8fFo7KGZ1bmN0aW9uKGMpe2MuRWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2g9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5RYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5UaD1mLlNiKDEwKTt0aGlzLkFoKCl9LEFoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuemIoKSwhMDt0aGlzLnNoKys7aWYoMTA8dGhpcy5zaCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFoLmJpbmQodGhpcyksMTAwKSwhMX0semI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpiKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGQ9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChkPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gZH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZiKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykmJmFbY10mJmFbY10uYWRFcnJvciYmYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbY10uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtjXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0seWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkVqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Haj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkdqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5SbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Muamo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5qanx8aGM7KGZ1bmN0aW9uKGMpe2MuaWo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5panx8aWM7KGZ1bmN0aW9uKGMpe2Mua2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmtqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5GbHx8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5IaXx8bWM7KGZ1bmN0aW9uKGMpe2MuR2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQWUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHliOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWUuYmluZCh0aGlzKSwxMDApfSxBZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkFlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuR2l8fG5jOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGE6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuSWl8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlZrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQmg9dGhpcy5EaD10aGlzLkNoPSExO3RoaXMuTmQ9W107dGhpcy55Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuYWs9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuQ2g9CiEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLmFpKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy55Zil7aWYodGhpcy5CaClicmVhaztjPXRoaXMueWZbZV07dGhpcy5YZihjKSYmKHRoaXMuTmQucHVzaChjKSx0aGlzLmFpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWU9YVtmXSxlPXRoaXMueWZbZV0sdGhpcy5YZihlKSYmYy5wdXNoKGUpO3JldHVybiBjfSxhaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sc286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkNoKWZvcih0aGlzLkJoPSEwLGE9MDthPHRoaXMuTmQubGVuZ3RoO2ErKyl0aGlzLk5kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTmRbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuYWt8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuemp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5LYyhrLlJvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5LYyhrLmduKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHZjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksd2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbT0hMTtILmdhKCk7SC54aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnhoKCksCmZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0guZ2EoKTtmLk1lKHdpbmRvdyxmLlYoMTApLHt9KTt2YXIgaWE9Zi5WKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuSmp8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5SaD10aGlzLmNvbmY9dGhpcy5MYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSmQ9MDt0aGlzLmdiPSIiO2Yud2IoIm5ld0FkZGVsaXZlcnkiKX1jLkppPWE7YS5wcm90b3R5cGU9e1puOmZ1bmN0aW9uKGEpe3RoaXMuUmg9YX0sRmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmdiPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKVm46ZnVuY3Rpb24oYSl7dGhpcy5MYj1hfSxVbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmdiXSYmdGhpcy5jb25mW3RoaXMuZ2JdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBjfSwkYzpmdW5jdGlvbihhLGMpe3ZhciBlPSExLGc9ITE7aWYodGhpcy56bSgpKXRoaXMuTGIuZyh0aGlzLkxiLlBjLHRoaXMuTGIucWEsdGhpcy5MYi54ZixmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSx0aGlzLkxiLmljKTtlbHNlIGlmKGwuRGImJiFsLkZpKWwuVm0oZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay5IYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixtPW5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJm0udW8oKTttLmV4aXRGdWxsc2NyZWVuKCk7Zi53YigibmV3SG9tYWREaXNwbGF5Iik7ClE9bT1uZXcgUWEobSx0aGlzLkxiLGgpO20uU24odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBxPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKHE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShxKX1hfHxmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5mZiYmKGU9dGhpcy5wbGF5ZXIuZmYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO20uaGYoYSxlLGcpO3RoaXMucGxheWVyLmRpKG0pfX0sem06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5KZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkpkLmdldFRpbWUoKSx0aGlzLkpkPWEsM0U1PGM/ITA6ITE7dGhpcy5KZD1hO3JldHVybiExfSxrbzpmdW5jdGlvbigpe2Yud2IoInByZXJvbGwiKTtmLkVmKCJwcmVyb2xsIik7CnZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlZnKGEpKT90aGlzLiRjKGEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9LGpvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlJoKXtmLkVmKCJwb3N0cm9sbCIpO2Yud2IoInBvc3Ryb2xsIik7dGhpcy5abighMCk7dmFyIGM9dGhpcy5jb25mLGU9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihlPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGU9dGhpcy5WZyhlKSk/dGhpcy4kYyhlLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihmLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSwKZi5vKGsud2QsdGhpcy5wbGF5ZXIubCgpKSl9fSxWZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sS246ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLmpvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LFNkOmZ1bmN0aW9uKGEpe2Yud2IoIm1pZHJvbGwiKTtmLkVmKCJtaWRyb2xsIik7aWYoIXRoaXMuR2gpe3RoaXMuR2g9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuJGMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2g9ITF9LmJpbmQodGhpcyksMUUzKSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZi5vKGsud2QsCnRoaXMucGxheWVyLmwoKSkpfX0sSm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Zbih0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmxmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmtvKCk7dGhpcy5wbGF5ZXIubGYmJnRoaXMuSm4oKTt0aGlzLktuKCl9fX0pKGMpO3ZhciBmYT1jLkppfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucXB8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYWlwYWVHaG9oY2hlaVZvLHBhaXBhZUdob2hjaGVpVm8pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.139.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.139.9.5.clients.your-server.de
Software
AmazonS3 /
Resource Hash
d401af0f09ad3c09f96937c687b06292b8e68e82f1666228b132fd6373416887

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:33 GMT
Connection
keep-alive
Content-Length
750
Last-Modified
Fri, 24 Mar 2017 14:23:08 GMT
Server
AmazonS3
Etag
"ce35c595339f2cdb3381665635e6f7e0"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/xml; 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
X-Homad-Instance
de35-homad-3
X-Homad-Url
http://d379964aymex2x.cloudfront.net/check.xml?empty=true
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
truncated
/ Frame E031
4 KB
4 KB
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a7534f0f0571e65e61cb4cbd07673cbf004f38327cae2a669091a92d6c663de7

Request headers

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

Response headers

Content-Type
application/font-woff;charset=utf-8
collect
www.google-analytics.com/
35 B
110 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerStart&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&cm2=1&z=1339873833
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Sat, 01 Feb 2020 02:52:08 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1698865
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
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=VideoStart&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=&gjid=&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&cm5=1&z=814900497
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Sat, 01 Feb 2020 02:52:08 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1698865
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
720p00000.ts
lx56.spieletips.de/172493/ Frame E031
2 MB
2 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00000.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
83d917ca4e1780fdada9c3cacd6fbc6966a510cfbb407dd65973869a5ff95cb7

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:34 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:42 GMT
Server
nginx/1.4.7
ETag
"55f9346a-266b7c"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
2517884
Expires
Thu, 31 Dec 2037 23:55:55 GMT
720p00001.ts
lx56.spieletips.de/172493/ Frame E031
1 MB
1 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00001.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
8de492bfeea7153409a3030ba43229779caad3e33eed6cb5c0b222a9bb3681ba

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:35 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:42 GMT
Server
nginx/1.4.7
ETag
"55f9346a-11dcf4"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
1170676
Expires
Thu, 31 Dec 2037 23:55:55 GMT
720p00002.ts
lx56.spieletips.de/172493/ Frame E031
3 MB
3 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00002.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
431cb2d97fdf7950db8155d6424db8284d1f961548a4c895478683d94aab8a55

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:36 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:42 GMT
Server
nginx/1.4.7
ETag
"55f9346a-2c1468"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
2888808
Expires
Thu, 31 Dec 2037 23:55:55 GMT
720p00003.ts
lx56.spieletips.de/172493/ Frame E031
2 MB
2 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00003.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
1025ffc625f81c00ffa29f7b922c239411e7f9614eedc28bcac6ba06231b798a

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:37 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:43 GMT
Server
nginx/1.4.7
ETag
"55f9346b-1ecc40"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
2018368
Expires
Thu, 31 Dec 2037 23:55:55 GMT
collect
www.google-analytics.com/r/
35 B
111 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=139742495&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&ul=en-us&de=UTF-8&dt=IrfanView%20Download&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=VideoImpression&el=172493%20--%20winload-irfanview-video-hd.mp4%5Bvideojs%2F7.6.6%5D%5BSite%20Autoplay%5D&_u=6GBAAEAB~&jid=41460079&gjid=1885820546&cid=238248099.1582224383&tid=UA-204785-4&_gid=166621790.1582224383&_r=1&cd1=Marvin%20Basse&cd5=2020-01-20T12%3A00%3A00%2B01%3A00&cg1=Software-File&cg2=1188189&cg3=03-2016&cd2=software&cd6=Produkt%C3%BCbersichtsseite-Winload-Giga-Dublette&cd8=website&cd3=1188189&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=bildbearbeitung%2C%20bildverwalter%2C%20foto&cd42=legacy&cd10=&cd9=201406&cd11=172493&cd12=PRESS&cd13=189&cd14=true&cd19=Site%20Autoplay&cd38=videojs%2F7.6.6&cd44=0&z=858228640
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:38 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
/
track.adform.net/Serving/Cookie/
73 B
495 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.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.2.235 , 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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:40 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
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=1582224400
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
bc1dbb48204d903ce59293cd13eeb1e6f8673746120e021d34690c9721234406

Request headers

Referer
https://www.giga.de/downloads/irfanview/
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
Thu, 20 Feb 2020 18:46:40 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
beste-grafiktools-rcm485x210.jpg
static.giga.de/wp-content/uploads/2016/08/
22 KB
22 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/08/beste-grafiktools-rcm485x210.jpg
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
5c39efd61d1d243d9dbcca78c1114fb80222cf91fa7225e80136e58fa212d5d8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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, 14 Feb 2020 09:07:20 GMT
x-content-type-options
nosniff
age
553160
filer-source
a658da1c20f9de6c181ca13eac487f270aac37ac6f7615d517d48deea133957d
x-cache
HIT
status
200
accept-language
bytes
content-length
22373
x-xss-protection
1; mode=block
last-modified
Fri, 14 Feb 2020 09:07:20 GMT
server
nginx/1.10.3
filer-attr
W1s0ODUsMjEwXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sun, 15 Mar 2020 09:07:20 GMT
irfan-view-64-bit-bild-rcm380x210.jpg
static.giga.de/wp-content/uploads/2016/08/
22 KB
22 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/08/irfan-view-64-bit-bild-rcm380x210.jpg
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
02b27425a6fc28368412ad8094577e0d82bf81c072208c98734faf904aa5686a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:38:14 GMT
x-content-type-options
nosniff
age
346106
filer-source
ce63be9f070f113f3c6152bff0af2b874e712aed948a23ac9ed5e2cc94bd3578
x-cache
HIT
status
200
accept-language
bytes
content-length
22063
x-xss-protection
1; mode=block
last-modified
Sun, 16 Feb 2020 18:38:14 GMT
server
nginx/1.10.3
filer-attr
W1szODAsMjEwXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Tue, 17 Mar 2020 18:38:14 GMT
irfanview-6-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
22 KB
22 KB
Image
General
Full URL
https://static.giga.de/wp-content/gallery/irfanview_1/irfanview-6-rcm350x0.jpg
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
d921d49ee698957afb73e58f9b0556bf8331f4426a97114c35f7fb50c546198a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Wed, 19 Feb 2020 06:01:58 GMT
x-content-type-options
nosniff
age
132282
filer-source
fbcd74028e7c776f8d6bbad90a1c813b1f6b2a042dd56c3ce279eac4153d4e93
x-cache
HIT
status
200
accept-language
bytes
content-length
22418
x-xss-protection
1; mode=block
last-modified
Tue, 18 Feb 2020 07:33:26 GMT
server
nginx/1.10.3
filer-attr
W1szNTAsMzQxXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Thu, 19 Mar 2020 07:33:26 GMT
irfanview-7-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
30 KB
30 KB
Image
General
Full URL
https://static.giga.de/wp-content/gallery/irfanview_1/irfanview-7-rcm350x0.jpg
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
bad9ef42ced5d8aac23d9f70170a87b277edb37ed96af40ae38b073fac3c53ed
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Wed, 19 Feb 2020 06:01:58 GMT
x-content-type-options
nosniff
age
132282
filer-source
fbdeebb254ba3ca9cb71048ee6965f9353a3210d8a2c73db944f5645b39a7caa
x-cache
HIT
status
200
accept-language
bytes
content-length
30547
x-xss-protection
1; mode=block
last-modified
Tue, 18 Feb 2020 18:50:06 GMT
server
nginx/1.10.3
filer-attr
W1szNTAsMjk1XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Thu, 19 Mar 2020 18:50:06 GMT
irfanview-8-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
28 KB
28 KB
Image
General
Full URL
https://static.giga.de/wp-content/gallery/irfanview_1/irfanview-8-rcm350x0.jpg
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
a83f724e3dd47acdb001c1a5284f1be01ae823e28b6099a49bacd192e78da9ea
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Wed, 19 Feb 2020 06:01:58 GMT
x-content-type-options
nosniff
age
132282
filer-source
81c101cf36e7d94b15d57c4fc148b2c327ff18c8a25e5f0d8a43b5d062581f0d
x-cache
HIT
status
200
accept-language
bytes
content-length
28458
x-xss-protection
1; mode=block
last-modified
Fri, 31 Jan 2020 12:09:16 GMT
server
nginx/1.10.3
filer-attr
W1szNTAsMjYwXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sun, 01 Mar 2020 12:09:16 GMT
irfanview-9-rcm350x0.jpg
static.giga.de/wp-content/gallery/irfanview_1/
37 KB
38 KB
Image
General
Full URL
https://static.giga.de/wp-content/gallery/irfanview_1/irfanview-9-rcm350x0.jpg
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
98c6f020b4d1a0f7c8b909f365d0c220313348659b6b71be8a1f67afd7ec8e54
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Wed, 19 Feb 2020 06:01:58 GMT
x-content-type-options
nosniff
age
132282
filer-source
25dde8ce07985c0347146bb0a3813d4b48cac7f028268149a1569dd3e29e2f39
x-cache
HIT
status
200
accept-language
bytes
content-length
37992
x-xss-protection
1; mode=block
last-modified
Tue, 21 Jan 2020 04:54:27 GMT
server
nginx/1.10.3
filer-attr
W1szNTAsMzU5XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Thu, 20 Feb 2020 04:54:27 GMT
tr
www.facebook.com/
44 B
249 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:f11c:8183: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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:40 GMT, Thu, 20 Feb 2020 18:46:40 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
Thu, 20 Feb 2020 18:46:40 GMT
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=IrfanView%20Download&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F&contentPieceId=1188189&publishDate=2016-03-14T13%3A52%3A40%2B01%3A00&_=1582224400532.-1232796457
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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:40 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.4f65a0e9fe0d6367b27b800ce874e982.js
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
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
6DAB57AC4710B3A8
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Thu, 20 Feb 2020 18:46:40 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
/CaMaiGy+JG3g/FCFn/nuXCy7jIM8r+oBsrdCHGya8W9Lk3q6RAjczOwxKF57VEcI9C5s/9faME=
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=62833753
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.104 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:40 GMT
content-encoding
gzip
last-modified
Thu, 16 Jan 2020 08:30:04 GMT
server
nginx
etag
W/"5e201f0c-9d13"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 20 Feb 2020 18:51:40 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1 KB
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.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.30 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn3.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:40 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 18:52:32 GMT
Server
ibillboard
ETag
W/"59d13970-421"
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Thu, 27 Feb 2020 10:37:42 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.4f65a0e9fe0d6367b27b800ce874e982.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.98.41 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-98-41.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
cceb681f54cc9f7989ba129b3c5c5ffd544ff58bf7e47daad911ad58ac00de5c

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:40 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
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
580 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=11894481&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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:40 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
map
ih.adscale.de/ Frame 8214
Redirect Chain
  • https://ih.adscale.de/map?ssl=1&format=video
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=1431cd1356274ad2a9f4bf7759a8bcf5
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=1431cd1356274ad2a9f4bf7759a8bcf5
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
3.124.22.230 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-3-124-22-230.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=1431cd1356274ad2a9f4bf7759a8bcf5
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/downloads/irfanview/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
uu=1431cd1356274ad2a9f4bf7759a8bcf5
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/downloads/irfanview/

Response headers

status
200
date
Thu, 20 Feb 2020 18:46:40 GMT
content-type
text/html;charset=ISO-8859-1
content-length
2214
server
Apache-Coyote/1.1
set-cookie
tu=4#3395738820#101~~439506~439506~1#38~~439506~439506~1#72~~439506~439506~1#42~~439506~439506~1#75~~439506~439506~1#60~~439506~439506~1#108~~439506~439506~1#63~~439506~439506~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None

Redirect headers

status
302
date
Thu, 20 Feb 2020 18:46:40 GMT
content-length
0
location
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=1431cd1356274ad2a9f4bf7759a8bcf5
server
Apache-Coyote/1.1
set-cookie
uu=1431cd1356274ad2a9f4bf7759a8bcf5; Domain=.adscale.de; Expires=Wed, 17-Feb-2021 11:13:20 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/2dd2d6ca-6e9e-49f2-90f8-026c8328ffbf/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%2F
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.202.74 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-74.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
60fa9d34d5e1b7d6bf0e337cb4aa62f40bcbd6948a2566632b82dac7f18fe5b0

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
34
date
Thu, 20 Feb 2020 18:46:06 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
FRA53-C1
x-amz-cf-id
XPJGFEy6UraiBUXc3fvbcmMkMAs8wVbxF0APHUWP_Bf-23nFomOqOg==
via
1.1 660f4277d8fbef27985e8a4a97e362cc.cloudfront.net (CloudFront)
segments
api.theadex.com/v0.9/pub/
56 B
126 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.125 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:40 GMT
content-length
56
content-type
text/plain; charset=utf-8
p.min.js
cdn.emetriq.de/adp/profiling/0.2.23/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.23/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:5000:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ffe449cb822dca1ae4d006567b52b888046dee6ea1197443d7d6978f4a41e008

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 14:38:30 GMT
content-encoding
gzip
last-modified
Thu, 20 Feb 2020 14:13:37 GMT
server
AmazonS3
age
14891
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
PPsGO7sYuX_b.QpC_Qeh9F5WPlPVFYxf
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA53-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
n_SoELSRCp1goXjukg-RMa0oOUob4eNH07MqRy-Pr0jpQQhqgPCrYw==
via
1.1 1cc446ef4692d8e752b16c07f2f58a59.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=IrfanView%20Download&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Firfanview%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=86421fabd0db152b1e74d1a98349514f&event_id=page_view&_sid=69511&_ver=0.2.23&_seg=jsonp&_=60433478125
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.23/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.98.41 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-98-41.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
c8f4064e6956611e3005c1d88b020f2ab64d148cd765c0d248fd40cb193606ab

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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 18:46:40 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/downloads/irfanview/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.200.89.230 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-200-89-230.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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, 17 Feb 2020 17:23:40 GMT
Content-Encoding
gzip
Last-Modified
Mon, 10 Feb 2020 18:25:47 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 FDF9
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BD7kWi_ABiJ0BSUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4218649483600541032
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4218649483600541032
Requested by
Host: www.giga.de
URL: https://www.giga.de/downloads/irfanview/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.98.41 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-98-41.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/5.0 (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
Thu, 20 Feb 2020 18:46:40 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
Thu, 20 Feb 2020 18:46:40 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4218649483600541032
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
activation
adstax-match.adrtx.net/ Frame ECAD
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
176.34.153.100 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-176-34-153-100.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/downloads/irfanview/
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/downloads/irfanview/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Thu, 20 Feb 2020 18:46:41 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
720p00004.ts
lx56.spieletips.de/172493/ Frame E031
1 MB
1 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00004.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
eb8f9a8d36e090e24f0c96c90249a7e9e2380cb00f8d27459a9dfe3a205bbd7b

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:41 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:43 GMT
Server
nginx/1.4.7
ETag
"55f9346b-150d94"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
1379732
Expires
Thu, 31 Dec 2037 23:55:55 GMT
usersync
uss.xplosion.de/
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=86421fabd0db152b1e74d1a98349514f
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.98.41 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-30-98-41.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:41 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=1582224403000&__it=-60&__ic=727391&__iq=ce622a7cc3514b522a3d6b39652425fb&__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/downloads/irfanview/
User-Agent
Mozilla/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
Thu, 20 Feb 2020 18:46:43 GMT
Last-Modified
Fri, 12 Feb 2010 18:46:24 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
Thu, 14 Feb 2013 18:46:24 GMT
720p00005.ts
lx56.spieletips.de/172493/ Frame E031
3 MB
3 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00005.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
6d94902f9b25d3e9901621c60ca879b92dd6de0d7812b3846b2b45d9cf4ee948

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:45 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:43 GMT
Server
nginx/1.4.7
ETag
"55f9346b-2cd58c"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
2938252
Expires
Thu, 31 Dec 2037 23:55:55 GMT
720p00006.ts
lx56.spieletips.de/172493/ Frame E031
4 MB
4 MB
XHR
General
Full URL
https://lx56.spieletips.de/172493/720p00006.ts
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
82.149.242.6 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.4.7 /
Resource Hash
cd906094f5871ec94dc397bde99d8d3348277b7b6c29a71a5012e2e48e8079b0

Request headers

Referer
https://videos.giga.de/embed/172493?autoplay=1
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
Thu, 20 Feb 2020 18:46:50 GMT
Last-Modified
Wed, 16 Sep 2015 09:20:43 GMT
Server
nginx/1.4.7
ETag
"55f9346b-39b3f4"
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Content-Length
3781620
Expires
Thu, 31 Dec 2037 23:55:55 GMT

Verdicts & Comments Add Verdict or Comment

216 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 boolean| smbt_only function| requirejs function| require function| define object| DKUIM_SETTINGS string| GIGA_AREA string| WP_SITEURL string| SHUTTLE_CORE_VIDEO_CDN_VIDEO_URL string| SHUTTLE_API_URL string| VIDEO_INLINE_MODE boolean| VIDEO_AUTOPLAY_DISABLED function| st_cookie object| is number| USER_PAGE_COUNT number| LUX_t_start number| LUX_t_end object| gaLog string| szmvars object| iom object| _absconfig object| smbVideoService string| lazyLoadAmdUrl string| polyfillAmdUrl object| dependencies 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 function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam object| google_js_reporting_queue number| google_srt object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars function| _extends function| _typeof object| nativendo_588f272a3e49c_conf function| _ function| setImmediate function| clearImmediate boolean| apstagLOADED object| TFASC object| TRC object| _taboola number| taboola_view_id object| TRCImpl function| __trcError function| __trcJSONify object| _econa function| send 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| $ function| jQuery function| isEmpty object| closure_memoize_cache_ 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| txt object| _tblConsole undefined| msg object| _comscore object| YLHH object| yieldlove_site_settings object| yieldlove_cmd object| core function| pbjsYLHHChunk function| checkOmid3pExist object| de_meetrics undefined| list object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad function| SDG_CookieLayer string| preloadType function| webpackJsonpdkuim object| Base64 boolean| dkuimInited 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| stroeerCore function| udm_ object| ns_p object| COMSCORE object| confiant object| nativendo_588f272a3e49c_map function| confiantTryToGetConfig object| config string| sdm_ift object| trcManager object| trcRbox undefined| options number| _m6rApiLoaded object| teadsscript object| teads object| cp2 object| Adform function| _h object| _adexc object| adex string| apsrc object| ibb_lib object| _EQLService object| _EQPScript object| audienceProjectLayer object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

1 Cookies

Domain/Path Name / Value
videos.giga.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6InlKdkciLCJ0c2wiOjE1ODIyMjQ0MDAsIm52IjowLCJ1cHQiOjE1ODIyMjQzODMsImx0IjoxNTgyMjI0MzgzfV0.

7 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/downloads/irfanview/","tim":1582224382988}'. TypeError: Cannot read property 'getItem' of null
console-api log URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js(Line 1)
Message:
VIDEOJS: Play middleware has been registered with videojs
console-api log (Line 122)
Message:
inline_ad: No video available; loading inline-ad by Teads
console-api warning URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js(Line 1)
Message:
AdsLoader error: AdError 303: No Ads VAST response after one or more Wrappers
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta
console-api log URL: https://cdn.emetriq.de/adp/profiling/0.2.23/p.min.js(Line 2)
Message:
cacheFileId false

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.

a.teads.tv
aax-eu.amazon-adsystem.com
ads.betweendigital.com
adserver.schneevonmorgen.com
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ajax.googleapis.com
ams.creativecdn.com
api.theadex.com
api.yieldlove-ad-serving.net
bbcdn-bbnaut.ibillboard.com
bh.contextweb.com
bttrack.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.m6r.eu
cdn.speedcurve.com
cdn.stroeerdigitalgroup.de
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
cmp.teads.mgr.consensu.org
confiant-integrations.global.ssl.fastly.net
creativecdn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
irqs.ioam.de
js.adscale.de
js.stroeermediabrands.de
lb75.s400.meetrics.net
lx56.spieletips.de
match.adsrvr.org
match.taboola.com
match.zorosrv.com
maxcdn.bootstrapcdn.com
media.oadts.com
nugmw.userreport.com
pagead2.googlesyndication.com
pixel.rubiconproject.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
px.powerlinks.com
rtb.mfadsrvr.com
s0.2mdn.net
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
ssl.2.damoh.giga.de
static.giga.de
sync.mathtag.com
sync.teads.tv
t.teads.tv
tpc.googlesyndication.com
track.adform.net
tracking.m6r.eu
trc.taboola.com
ups.xplosion.de
uss.xplosion.de
video-adserver.ibillboard.com
videos.giga.de
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
104.85.250.71
107.178.241.34
109.71.25.30
136.243.5.14
141.226.224.32
143.204.201.153
143.204.202.10
143.204.202.68
143.204.202.74
144.76.115.236
148.251.151.158
151.101.114.2
151.101.13.194
151.101.14.2
151.101.14.217
151.101.14.49
161.156.66.178
172.217.22.2
176.34.153.100
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.194.129.32
18.194.21.214
18.194.47.206
18.200.89.230
185.184.8.30
185.22.221.117
185.29.135.181
185.33.223.203
188.40.16.106
188.42.29.196
192.132.33.46
193.46.63.75
194.213.222.30
2.18.232.7
209.197.3.15
216.58.207.66
23.36.232.106
23.37.42.216
2600:9000:2057:1000:12:6213:9cc0:93a1
2600:9000:214f:5000:1c:8c89:a300:93a1
2600:9000:214f:7200:1f:a1b:34c0:93a1
2606:4700:20::681a:5fb
2a00:1450:4001:806::2002
2a00:1450:4001:809::2003
2a00:1450:4001:817::2002
2a00:1450:4001:817::200a
2a00:1450:4001:81a::2001
2a00:1450:4001:81c::200a
2a00:1450:4001:820::2002
2a00:1450:4001:821::2006
2a00:1450:4001:824::200e
2a02:26f0:6c00:280::5f76
2a02:26f0:f3:38c::2c92
2a03:2880:f11c:8183:face:b00c:0:25de
3.124.22.230
35.157.107.235
35.160.248.135
35.186.238.175
35.201.85.158
37.157.2.235
40.113.136.100
46.253.113.178
5.9.139.135
52.219.75.27
52.28.163.206
52.30.98.41
52.94.216.48
54.229.35.82
62.168.44.126
69.173.144.139
72.247.225.182
74.214.194.140
82.149.242.6
84.53.164.178
89.163.159.104
89.163.159.109
89.163.159.125
91.215.103.64
91.215.103.65
92.122.247.161
02b27425a6fc28368412ad8094577e0d82bf81c072208c98734faf904aa5686a
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06349254c3a3832ea81973863ce5873ab441c1b8006ee1cb553425d152fabf88
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
06c08e3ba81a0a899a551a554791954c7b40ff431de2c6a206e166617578903d
092fe41367a1374567b0892180ec5a1f17a60675613d3cfc8423fe99e5cd2c93
0a94e4bf1aaab82ffcf4564c53f210ad7fb8fc63e59a992d1921a8b06800e270
0b7f95ea376c84f25dd1359009f53c0a00a2999c897fde63e84d8384c019f614
0ccc896f3f0394fd869e82a74ae54759f3181e636b59a71d5628a8e02b38019d
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0f1fe6829fb73f0beec9dcea8df0429a5a4b631884025d0c73b090d99d4d766b
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
1025ffc625f81c00ffa29f7b922c239411e7f9614eedc28bcac6ba06231b798a
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
12fc096219ba602c4dc4ff0b88c55300ad603f3722ca0ea843d051c77b6dc366
147661cca6ee800a4b88686db1e7b346feab5abf1e2e0788d7d7dfe9b8eec98c
19e45c5dde15bf9a8ca4352e4a29d79efe7ac02e80ac01ddfb8f6cf1fa27f4a1
1a36f0a6f239c7826ac18991fae20560138d016bbd336c5e5156b9ef15ebf523
1c1eab6817bfe0b9c7755066621ade487a59992e0c82af97cadfab2fd1d230b4
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
21d2518eee6b649ab93701f25839d3d1ef48f34f95efbff0b3496ad64ce04b2e
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
27b10092a55d2f9c6e69c6658af3b821a3abfe8c39560e98ac3680decad04a1d
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
36120315ac48cb331f54bbc978490bfa3ce4fec82cc3853d070ef7bb1a806755
3702a5c29c45e797736566a441f88528e6221205870110238032ba569bc41b79
3c6434ebf1fa8ad27a9f9b3d6b7d5cdd53338a11fdcd50d943872c680a5e9f3d
3cf51e4e895f4b00bfcbc9f57901ccc3481bf5d23d8c69cdc06fe55c22e3e3c5
431cb2d97fdf7950db8155d6424db8284d1f961548a4c895478683d94aab8a55
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4ae5b9dce4c32ec8213b405a1d299395de6ead926b4e32d829109a100130e896
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
546390dabb77f8ffa37721249a74cd4ac7e117b65a2860d797821c14c16e3cab
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
54a5f6b6e229bcae1a84f6c08614287d0770c96b7d2cfeffe9da6c6c90df2364
5942fe1a6c99120ec11cb98230cd557a5bfe60e98466dd96824a036d80a78aa3
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5c39efd61d1d243d9dbcca78c1114fb80222cf91fa7225e80136e58fa212d5d8
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
60fa9d34d5e1b7d6bf0e337cb4aa62f40bcbd6948a2566632b82dac7f18fe5b0
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
64e5bd2d8be02e17d12abd1b71fed709654b929f9af050817861f375a7421ac9
6539647c8b30c6775cb9f64c29f58be4853888f15ba57d080df76be46c1ae0dd
65651f0c924583ada4d7bad5b29fda11e6b43c4d908b58d0c03eaf8199a84e45
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6d94902f9b25d3e9901621c60ca879b92dd6de0d7812b3846b2b45d9cf4ee948
7036c5cd37e467a149892d8d26d5ffc2c5b6724b779f76c79cb65e466ac25a7a
72079e05e49316d0245e16904460e88a8001bfd320327e1de68dac8d12a89114
7397c0324a1f3a81f89c564497d4e203b9c124695dff9504c159f6c976b8bede
753def12fae8722bef366a340b5ab7c34a15c8cd8432cdddb30d8f91ab987b96
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76b4dc0a5b3add481baa93e6d069e86238698e53f1b7987e8d5ad896de2c0fb1
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
8003d73a961c2273e29b6765ce52c4c24ba66c48fb7e7d6d5dfb356eb618d820
80c4205204326ba3864af6bda1a5fc4650cfc338a733eb1bdf8ca85ae7dbba1c
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8362b4d06074b9fc35645e277fa5260a7a9295e51f5a6a8d2b817c08ded55b8b
83d917ca4e1780fdada9c3cacd6fbc6966a510cfbb407dd65973869a5ff95cb7
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
885077143dfd6b349963d8744ff08b803d3a66495c3ae47598083bded08546c2
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8ba4fbc5c2aeec4dedacc299f6ebdcc3dd955d427a28fadda44078c71714630c
8db3daba71f655f21d2c31ce0a75b09e27e339241b2acd3637580db9a9eb2120
8de492bfeea7153409a3030ba43229779caad3e33eed6cb5c0b222a9bb3681ba
8e1c26f07e47d2ae0bede45f5f426c0e7054732698b9d7a9ca2d7dc88f6ad23d
8f0aedeb149fe3b5bf923f3555963bf08ddf19aa1b484491e7119b3ab531c4d7
94fcc6c435deb16c5aa8c203f943306bd70b815ff2f1352186839727b550498e
95ebbe3b755f0749ef26c07fe339baacce6266f4792e0d4cd684d064fa40b2cf
9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
98c6f020b4d1a0f7c8b909f365d0c220313348659b6b71be8a1f67afd7ec8e54
9b4e4a1881cb5a98b060f962b6cec10b3bee8037e84f03d388814a00ddbf5e34
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79
a56833ce8542a71a519392f11f8351575830bd5ab43ff6ea30bbcb79dbbf2844
a7529a99b9298f983b181abd0097a0314957b556fab14b3cb4547dbefe2a58b0
a7534f0f0571e65e61cb4cbd07673cbf004f38327cae2a669091a92d6c663de7
a817c4029c6444c1fc28d3cb4696e3309ae4eb10000f5e2acd44d6cd6317b106
a83f724e3dd47acdb001c1a5284f1be01ae823e28b6099a49bacd192e78da9ea
a918d25f52d75a199fe1f36b7e9472fea96cc776173edce7e90e95b760a6f430
a9942f14fec918d4846d7a42de72ff8e171df54463653663d823b5a20fedf007
a9c7ad529b5c6eb3d69125c84f573deed9198400d84bd2e0fafaff0a2e68469f
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b6905f3ba1c618c861171cddd4461c554d0811680af7b6755ec96ac8a7a7c113
b7423f3ee15c4bef2886b80f5db2fa16bac4245f4a88d6efbf9c209f66e36817
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
b86419a02bd57b326f54607a5d3e298a99a9d6dd93cf0d3b0231f45c04c4c2da
b893f28293429077c17d50c1ad8bba0a52e1ece5786e049e6974219e95d4c3b5
ba263519f68b1d67e565e36be4ec1f7cb9435e7bbf7984b53a399b99e52c86de
bad9ef42ced5d8aac23d9f70170a87b277edb37ed96af40ae38b073fac3c53ed
bc1dbb48204d903ce59293cd13eeb1e6f8673746120e021d34690c9721234406
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c2c3c67c656f5bbacc8a2b3c93a33be25d48ffc482ac0276bffda46b59c1b1e3
c44986bcd6d5bd597a9a06f1129e3cc51cce4be78506dcd9a88c140e54c1376e
c6fd91eaab2f73592123d6b2759edb96ab94d8b205c86d5bd3e6afe6978100b8
c7c7935d9d94246d3e76bcda7e6d38a2166b8e66745839a78cb625fda8d933e3
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed
c8f4064e6956611e3005c1d88b020f2ab64d148cd765c0d248fd40cb193606ab
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
ccc542b9e603f4053ef6ebb98e7bd00d952839a21650d82d93b5c669716f3778
cceb681f54cc9f7989ba129b3c5c5ffd544ff58bf7e47daad911ad58ac00de5c
cd906094f5871ec94dc397bde99d8d3348277b7b6c29a71a5012e2e48e8079b0
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
ce35bf766dd37eae65f800a69b58741253b738644a9fb03704536fd77a437f8e
ce849b7260337e8b930e839d90732c26492c49ea8a39763439d600583b3fd070
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d1a22e27e6c4e5ede802181af1c093af4d5092c146dccadfbcf46ced481e2e9b
d401af0f09ad3c09f96937c687b06292b8e68e82f1666228b132fd6373416887
d77110be9f7aee2ee178c7497f8c108c2ddc4648662cecc5caa19db85f3e038c
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
d909950e23c968f5a3e2d18d4c80b65f2b089157b3fe78141de8659c539d909b
d921d49ee698957afb73e58f9b0556bf8331f4426a97114c35f7fb50c546198a
d9b0ade2de57587310d81f4b319025f2403c0b622a4c957270c3624ef0e1fc35
da1f4955b53f73076c02a1ddb0bb74dd56f6be7bdaa23db334e03cd3d8417634
db8bcd3688917cc569268e2fb6f4a4d93808e9e6915555d4099601434efc00c8
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e6a3685466a77fa9b1fc6c44ae027d0be6e1f9a0e4f7be0850faffb36e7271e4
e9900cab7526ba4a653a2e6a75ab3d4c9a7011e1a411c2f4136c977369e162a1
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
eb8f9a8d36e090e24f0c96c90249a7e9e2380cb00f8d27459a9dfe3a205bbd7b
ebe54c2b4cdb3fc0bd7bd45b2ce574428f0e970bdd1e9395f50916bce1628cc6
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f1ef4c669a56ec39c1623b03d8d2d4c46337bca16051509937ab377c40732c9b
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f8896eaef0f0ab516d60952b49da1ce2e7922678db3edafabc24f90a8769634a
fe87c9ed3ae9c73712c5484f1963b6d7e19ba5c48c51742f1bc5a84ac1dbc224
ffe449cb822dca1ae4d006567b52b888046dee6ea1197443d7d6978f4a41e008